如何获得整个链条中的例外应用程序。ThreadException事件处理程序?

StackOverflow https://stackoverflow.com/questions/61354

  •  09-06-2019
  •  | 
  •  

我只是工作上的固定了例外处理中的一个。网2.0的应用程序,我跌跌撞撞到一些奇怪的问题 应用程序。ThreadException.

什么我想要的是能够捕捉所有的例外事件的背后GUI元素(例如button_Click,等等)。然后我想到的过滤器,这些例外'死亡',例如与某些类型的例外情况的应用程序应保持运行和与其他人应当退出。

在另一个。网2.0的应用程序,我得知,默认情况下,只有在调试模式的例外情况实际上是留下一个应用程序。运行或应用程序。DoEvents的呼吁。在释放模式,这种情况不会发生,而该例外已经被抓住了'使用的应用程序。ThreadException事件。

然而,现在,我注意到 除传递的对象在ThreadExceptionEventArgs的应用程序。ThreadException事件始终是最里面的例外情况除外链.记录/调试设计目的,我真的想整个链条的例外情况。它不是容易确定哪些外部系统的失败,例如当你只是得到处理异常:当它的包裹,例如一NpgsqlException,然后至少你知道这是一个数据库的问题。

因此,如何获得到整个链条的例外情况,从这个事件? 它甚至有可能或者我需要我的设计excepion处理的另一种方式?

注意,我所做的-有点-有 解决方法 使用 应用程序。SetUnhandledExceptionMode, 但这是远远不够理想,因为我要滚我自己的消息循环。

编辑:以防止更多的失误, 该GetBaseException()方法不会做我想做的:它只是返回的最里面的异常,而唯一的事情我已经是最里面的异常。我想要获得在最例外!

有帮助吗?

解决方案

这个问题的更有用的措辞,并回答了这里:

为什么内部异常达到ThreadException处理程序并不是实际引发的异常?

其他提示

我试图再现这一行为(总是得到最里面的例外),
但我得到的例外,我希望,所有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.然后您可以使用相同过程中去的链获得所有例外情况。

例外。getbaseexception方法

根据某些信息在此,我使用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

这会打我正是你所寻找的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top