VB.NET捕获UnhandledException在VS调试可以捕获到直接打开却不能
vb.net吧
全部回复
仅看楼主
level 1
csu_devils 楼主
最近做了程序用到chart控件老是报出UnhandledException的异常也找不到原因,想用AppDomain.CurrentDomain.UnhandledException来捕获异常,自己写了类似的例子测试,在VS里面可以捕获到异常,但直接打开编译好的程序却还是弹出UnhandledException的异常窗口,求教各位大神这是什么原因?
2017年12月01日 06点12分 1
level 1
csu_devils 楼主
测试的例子代码如下:
Public Class Form1
Private Sub CurrentDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
Shell(Application.StartupPath & "\WindowsApplication9.exe", vbNormalFocus)
End
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
CheckForIllegalCrossThreadCalls = False
Timer1.Interval = 1000
Timer1.Start()
For i = 0 To 1000
Chart1.Series(0).Points.AddY(2.5)
Next
Dim t = New Threading.Thread(AddressOf datl)
t.Start()
End Sub
Private Sub datl()
Do Until False
Threading.Thread.Sleep(2000)
Chart1.Series(0).Points.Clear()
For i = 0 To 2000
Chart1.Series(0).Points.AddY(2.5)
Next
Loop
End Sub
End Class
2017年12月01日 07点12分 2
level 1
csu_devils 楼主
VS运行捕获到异常后执行程序重启,然后就弹出了异常窗口
2017年12月01日 07点12分 3
level 11
我曾经在用For Each的时候遇到过这个问题。如果在For Each的中途修改集合就会报出这个错误。
2017年12月01日 08点12分 4
我程序里没用到For Each,可能是在线程里面对chart的集合进行了操作导致的异常,而且这个异常一般都是程序运行了好几个小时才会出现,try catch 捕获不到,找不到原因只好用这个全局的异常捕获方法来处理[鄙视]
2017年12月01日 09点12分
@csu_devils 是不是线程冲突了?
2017年12月03日 05点12分
@csu_devils 我发现你用了CheckIllegalCrossThreadCall了。你最好不要用这个,然后用委托和Invoke来实现跨线程控件设置。
2017年12月03日 05点12分
@csu_devils 你把那个设成False只是关闭了冲突检测,用线程安全的Invoke方法才能避免冲突。
2017年12月03日 05点12分
level 1
csu_devils 楼主
我在程序里增加了一个线程异常的捕获Application.ThreadException,把异常处理语句移到了线程异常的处理方法里,然后在UnhandledException异常捕获方法里使用End接收进程,这样好像能勉强实现我想要的遇到异常重启程序的功能
2017年12月01日 09点12分 5
level 1
csu_devils 楼主
修改后的代码如下:
Imports System.Threading
Public Class Form1
Private Sub Application_ThreadException(sender As Object, e As ThreadExceptionEventArgs)
Shell(Application.StartupPath & "\WindowsApplication9.exe", vbNormalFocus)
End
End Sub
Private Sub CurrentDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
End
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler Application.ThreadException, AddressOf Application_ThreadException
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
CheckForIllegalCrossThreadCalls = False
Timer1.Interval = 1000
Timer1.Start()
For i = 0 To 1000
Chart1.Series(0).Points.AddY(2.5)
Next
Dim t = New Threading.Thread(AddressOf datl)
t.Start()
End Sub
Private Sub datl()
While True
Threading.Thread.Sleep(2000)
Chart1.Series(0).Points.Clear()
For i = 0 To 2000
Chart1.Series(0).Points.AddY(2.5)
Next
End While
End Sub
End Class
2017年12月01日 09点12分 6
1