AppDomain.UnhandledException事件如何工作?

时间:2013-11-06 17:43:11

标签: .net exception

我正在阅读有关该事件的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事件分开的是什么?这是否只是另一个“全部捕获”而不是其他代码处理某些东西而无法处理程序文件?

1 个答案:

答案 0 :(得分:4)

MSDN文章中的其余部分非常重要:

  

只有在线程的整个堆栈已经展开而没有找到适用的异常处理程序时,才会处理异常,因此可以引发事件的第一个位置是发起线程的应用程序域。

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

非常模糊的细节,使用AppDomains是一种高级编程技术。 AppDomains与项目无关。您通常只关心订阅AppDomain.CurrentDomain.UnhandledException事件,在Main()方法中执行此操作。

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

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