如何获得整个链条中的例外应用程序。ThreadException事件处理程序?
题
我只是工作上的固定了例外处理中的一个。网2.0的应用程序,我跌跌撞撞到一些奇怪的问题 应用程序。ThreadException.
什么我想要的是能够捕捉所有的例外事件的背后GUI元素(例如button_Click,等等)。然后我想到的过滤器,这些例外'死亡',例如与某些类型的例外情况的应用程序应保持运行和与其他人应当退出。
在另一个。网2.0的应用程序,我得知,默认情况下,只有在调试模式的例外情况实际上是留下一个应用程序。运行或应用程序。DoEvents的呼吁。在释放模式,这种情况不会发生,而该例外已经被抓住了'使用的应用程序。ThreadException事件。
然而,现在,我注意到 除传递的对象在ThreadExceptionEventArgs的应用程序。ThreadException事件始终是最里面的例外情况除外链.记录/调试设计目的,我真的想整个链条的例外情况。它不是容易确定哪些外部系统的失败,例如当你只是得到处理异常:当它的包裹,例如一NpgsqlException,然后至少你知道这是一个数据库的问题。
因此,如何获得到整个链条的例外情况,从这个事件? 它甚至有可能或者我需要我的设计excepion处理的另一种方式?
注意,我所做的-有点-有 解决方法 使用 应用程序。SetUnhandledExceptionMode, 但这是远远不够理想,因为我要滚我自己的消息循环。
编辑:以防止更多的失误, 该GetBaseException()方法不会做我想做的:它只是返回的最里面的异常,而唯一的事情我已经是最里面的异常。我想要获得在最例外!
解决方案
这个问题的更有用的措辞,并回答了这里:
其他提示
我试图再现这一行为(总是得到最里面的例外),
但我得到的例外,我希望,所有InnerExceptions完整。
这里是代码,我在使用的检验:
Private Shared Sub Test1()
Try
Test2()
Catch ex As Exception
Application.OnThreadException(New ApplicationException("test1", ex))
End Try
End Sub
Private Shared Sub Test2()
Try
Test3()
Catch ex As Exception
Throw New ApplicationException("test2", ex)
End Try
End Sub
Private Shared Sub Test3()
Throw New ApplicationException("blabla")
End Sub
Private Shared Sub HandleAppException(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
...
End Sub
子HandleAppException处理应用程序。ThreadException.Test1()方法被称为第一次。
这是结果(e ThreadExceptionEventArgs)我在HandleAppException:
ThreadException http://mediasensation.be/dump/?download=ThreadException.jpg
如果你正好赶上以及(重新)扔例外,没有InnerExceptions会显示出来,但它将所附的例外。堆栈跟踪, 像这样的:
在如此。Test3()在测试。vb:166线
在如此。测试2()在测试。vb:行159
在如此。Test1()在测试。vb:行151
通常,你只会失去整个例外链除的异常基于一个应用程序。ThreadException例外处理程序,如果例外发生在其他线。
从 MSDN Library:
这个事件使你的Windows的形式 应用程序来处理,否则 未经处理的例外情况发生在 Windows形式 螺纹。附上你 事件处理程序的ThreadException 事件处理这些例外情况, 这将离开你的应用程序 一个未知的状态。在可能的 例外应当处理的一个 结构异常处理区块。
方案:如果你穿的是,确保所有的线/异步通话是在一个尝试/抓块。或如你所说,你可以玩的应用程序。SetUnhandledExceptionMode.
刚刚发现一些有趣的事情。不同的GUI活动将得到您的不同结果。引发的异常从一种形式。所示的事件的处理程序将导致在应用程序。ThreadException醒目内大多数例外,但完全相同的代码运行的形式。负载的事件将导致在 外大多数 异常陷入的应用程序。ThreadException.
你有没有尝试过的例外。GetBaseException方法?这返回除其创建的应用程序。TreadException.然后您可以使用相同过程中去的链获得所有例外情况。
根据某些信息在此,我使用UnhandledExceptionMode.ThrowException而不是UnhandledExceptionMode.CatchException.然后我赶上的例外以外的形式是运行()这给了我整个链条的例外情况。
根据MSDN文件:
当复盖在一个源类,返回的异常的根本原因是一个或多个后续的例外情况。
Public Overridable Function GetBaseException() As Exception
Dim innerException As Exception = Me.InnerException
Dim exception2 As Exception = Me
Do While (Not innerException Is Nothing)
exception2 = innerException
innerException = innerException.InnerException
Loop
Return exception2
End Function
你可以使用的变化,这种分析异常链。
Public Sub LogExceptionChain(ByVal CurrentException As Exception)
Dim innerException As Exception = CurrentException.InnerException
Dim exception2 As Exception = CurrentException
Debug.Print(exception2.Message) 'Log the Exception
Do While (Not innerException Is Nothing)
exception2 = innerException
Debug.Print(exception2.Message) 'Log the Exception
'Move to the next exception
innerException = innerException.InnerException
Loop
End Sub
这会打我正是你所寻找的。