我只是在修复 .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() 方法不会做我想要的:它只返回最里面的异常,而我唯一已经拥有的是最里面的异常。我想了解最外面的异常!