6

当订阅事件时,AppDomain.CurrentDomain.UnhandledException什么条件会导致UnhandledExceptionEventArgs IsTerminating标志为真?即是什么导致异常被认为是致命的?

除非另有配置,否则默认情况下所有未处理的异常都是致命的吗?

4

3 回答 3

8

此属性始终为真。在 .NET 1.x 时代,它曾经可能是错误的。该版本允许线程因未处理的异常而死亡,而不会终止整个进程。只是效果不佳,程序员没有实现事件处理程序(或者不知道如何正确处理来自事件的异常,谁做的)所以线程只是在没有任何通知的情况下死亡。几乎不可能没有这个原因,难以诊断程序故障。

Microsoft 更改了 .NET 2.0 中的默认行为,未处理的异常终止程序。从技术上讲,仍然可以覆盖此行为,自定义 CLR 主机可以通过实现 IHostPolicyManager 接口使进程保持活动状态。并且默认主机支持<legacyUnhandledExceptionPolicy>配置元素。不要使用它,那里有龙。

于 2012-06-11T16:48:48.890 回答
4

不,由另一个应用程序产生的托管线程的未处理异常将使 IsTerminating 等于 false,因为它会杀死线程而不是整个应用程序。这是我在这种情况下唯一一次看到 IsTerminating 错误,而且MSDN 页面说这也是主要用例。

于 2012-06-11T14:53:04.660 回答
0

我将它用于测试目的。我想测试记录异常的 UnhandledExceptionHandler。所以我设置它以便我可以记录消息但不要击落测试线程。

但通常,这意味着在我见过的所有其他情况下,IsTerminating 标志都设置为 true。

于 2012-12-12T16:53:01.437 回答