2

我正在阅读有关该事件的 MSDN 页面(http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(v=vs.110).aspx),我知道它可以是用于处理您的“实际”代码未捕获的异常,但我不明白它在这个意义上是如何工作的:

This event can be handled in any application domain. The event is not necessarily raised in the app domain where it occurred

每个项目是否被视为不同的应用程序域?我认为整个解决方案是一个域。此外,这个事件与 Application.ThreadException 事件有什么区别?这只是在程序文件中抛出的另一个“包罗万象”,以防其他代码无法处理某些事情吗?

4

1 回答 1

4

MSDN 文章中的其余注释很重要:

仅当线程的整个堆栈在没有找到适用的异常处理程序的情况下展开时,异常才会被处理,因此可以引发事件的第一个位置是在线程发起的应用程序域中。

“线程的来源”是重要的细节,代码可能是通过 AppDomain.CreateInstanceFromAndUnwrap 或 ExecuteAssembly 创建的代理从另一个 AppDomain 调用的,这是让代码在另一个 AppDomain 中运行的基本方法。否则,从 System.Exception 派生的类应该具有采用 SerializationInfo 的构造函数的关键原因,即异常从一个 AD 序列化到另一个 AD 的机制。

非常晦涩的细节,使用 AppDomains 是一种高级编程技术。AppDomains 与项目没有任何关系。您通常应该只关心订阅 AppDomain.CurrentDomain.UnhandledException 事件,在您的 Main() 方法中这样做。

Application.ThreadException 是 Winforms 的实现细节。它仅表示在 UI 线程上引发的未处理异常。基本假设是事件处理程序中未处理的异常不一定是致命的,因为此类事件处理程序很少对程序的状态产生重大影响。因此处理异常并允许程序继续运行在技术上是可行的。

这是一个非常值得怀疑的假设,因为某些事件处理程序中的崩溃肯定会产生影响,并且您无法确切知道是哪个事件处理程序导致了异常。因此,最佳实践是不允许引发该事件。调用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException) 以禁用事件,您的 AppDomain.UnhandledException 事件处理程序现在将被使用,就像任何未处理的异常一样。

于 2013-11-06T19:08:26.183 回答