如何在 Application.ThreadException 事件处理程序中获取整个异常链?

Tob*_*obi 5 .net exception winforms

我当时正在修复 .NET 2.0 应用程序中的异常处理,我偶然发现了Application.ThreadException的一些奇怪问题。

我想要的是能够捕获 GUI 元素背后的事件的所有异常(例如,button_Click 等)。然后,我想过滤这些“致命性”异常,例如,对于某些类型的异常,应用程序应该继续运行,对于其他类型的异常,应用程序应该退出。

在另一个 .NET 2.0 应用程序中,我了解到,默认情况下,只有在调试模式下,异常才会真正留下 Application.Run 或 Application.DoEvents 调用。在发布模式下,这种情况不会发生,并且必须使用 Application.ThreadException 事件“捕获”异常。

然而现在,我注意到Application.ThreadException事件的ThreadExceptionEventArgs中传递的异常对象始终是异常链中最里面的异常。出于日志记录/调试/设计目的,我确实想要整个异常链。确定哪个外部系统失败并不容易,例如当您刚刚处理 SocketException 时:当它被包装为 NpgsqlException 时,那么至少您知道这是数据库问题。

那么,如何从该事件中获取整个异常链呢?是否有可能,或者我是否需要以另一种方式设计异常处理?

请注意,我确实有一个使用Application.SetUnhandledExceptionMode 的解决方法,但这远非理想,因为我必须滚动自己的消息循环。

编辑:为了防止更多错误,GetBaseException() 方法不会执行我想要的操作:它只返回最里面的异常,而我唯一已经拥有的是最里面的异常。我想得到最外面的异常!