.net AppDomain.UnhandledException事件如何工作?

.net AppDomain.UnhandledException事件如何工作?,.net,exception,.net,Exception,我阅读了MSDN页面上关于事件()的内容,我知道它可以用来处理“实际”代码无法捕获的异常,但我不明白它在这种意义上是如何工作的: 此事件可以在任何应用程序域中处理。 事件不一定在发生的应用程序域中引发 每个项目是否被视为不同的应用程序域?我认为整个解决方案是一个领域。此外,此事件与Application.ThreadException事件的区别是什么?如果其他代码无法处理某些内容,这是否只是程序文件中的另一个“包罗万象”呢?MSDN文章中的其余部分很重要: 只有在未找到适用的异常处理程序的情况下

我阅读了MSDN页面上关于事件()的内容,我知道它可以用来处理“实际”代码无法捕获的异常,但我不明白它在这种意义上是如何工作的:

此事件可以在任何应用程序域中处理。
事件不一定在发生的应用程序域中引发


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

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.ThroweException)禁用该事件,您的AppDomain.UnhandledException事件处理程序现在将被使用,就像它用于任何未处理的异常一样。

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事件处理程序现在将被使用,就像它用于任何未处理的异常一样。

每个进程(a
.exe
)可以包含1到*s(99%的所有项目仅使用1),每个
AppDomain
可以包含1到*s,其中
线程的0到*s可以是消息循环。每个进程(a
.exe
)可以包含1到*s(99%的项目只使用1个),每个
AppDomain
可以包含1到*s,其中
线程的0到*s可以是消息循环。