我的应用程序中有后台线程。当其中一个线程获得未处理的异常时,整个CLR退出。
这是正常的行为,还是CLR中的错误?
我希望线程会退出,但CLR会继续工作。
答案 0 :(得分:7)
.NET应用程序中的默认行为是在发生未处理的异常时退出。当异常未处理时,程序处于未知且可能不稳定的状态。仅仅因为它发生在后台线程中并不意味着错误不会影响程序的其余部分。在这种情况下,运行时最谨慎的做法是转储程序。
您可以查看AppDomain.CurrentDomain.UnhandledException
,这将允许您捕获未处理的异常并做出相应的反应。更好的解决方案是使用try...catch
包装线程proc。但只有它处理它知道如何处理的异常。这样做:
void MyThreadProc()
{
try
{
// ...
}
catch
{
// handle all exceptions
// This is a BAD idea
}
}
这是一个非常糟糕的主意,因为它可以掩盖您确实希望传播到主程序的异常。
答案 1 :(得分:4)
您的预期行为曾经是1.1中的行为。人们普遍认为这是一个坏主意。当您在任何线程中有未处理的异常时,您的进程可能会处于不一致状态。可以部分应用对共享数据的更新等。运行时没有安全处理此方案的信息,甚至不知道如何处理此方案,因此它的选择将等于终止线程并使程序保持不变一个奇怪的国家。这可能导致资源泄漏,挂起,数据损坏等。通过在给定未处理的异常的情况下终止进程,您确切知道发生了什么,该过程结束。
答案 2 :(得分:1)
是的,这是正常的,你可以看到类似question的更多细节。
答案 3 :(得分:1)
这是CLR从v2.0开始的正常行为。这是一篇MSDN帖子。为了避免进程终止,你可以使用类似的东西
<legacyUnhandledExceptionPolicy enabled="1"/>
这是不可取的。
答案 4 :(得分:0)
这是正常行为。也许您希望捕获异常以防止应用程序退出。