C# 当线程获得未处理的异常时,CLR退出

C# 当线程获得未处理的异常时,CLR退出,c#,.net,clr,unhandled-exception,C#,.net,Clr,Unhandled Exception,我的应用程序中有后台线程。当其中一个线程获得未处理的异常时,整个CLR将退出 这是正常行为还是CLR中的错误 我希望线程将退出,但CLR将继续工作。这是正常行为。您可能希望捕获异常以阻止应用程序退出。这是v2.0版CLR的正常行为。这里有一篇关于这个的帖子。为了避免进程终止,您可以使用这样的方法 <legacyUnhandledExceptionPolicy enabled="1"/> 这是不可取的 您的预期行为过去是1.1中的行为。人们普遍认为这是个坏主意。当任何线程中存在未

我的应用程序中有后台线程。当其中一个线程获得未处理的异常时,整个CLR将退出

这是正常行为还是CLR中的错误


我希望线程将退出,但CLR将继续工作。

这是正常行为。您可能希望捕获异常以阻止应用程序退出。

这是v2.0版CLR的正常行为。这里有一篇关于这个的帖子。为了避免进程终止,您可以使用这样的方法

<legacyUnhandledExceptionPolicy enabled="1"/>


这是不可取的

您的预期行为过去是1.1中的行为。人们普遍认为这是个坏主意。当任何线程中存在未处理的异常时,进程可能处于不一致状态。对共享数据的更新可能会部分应用,等等。运行时没有安全处理此场景的信息,甚至不知道如何处理此场景,因此它的选择将相当于终止线程并使程序处于奇怪的状态。这可能会导致资源泄漏、挂起、数据损坏等。如果出现未经处理的异常,则终止进程。如果您确切知道发生了什么,则进程将结束。

在.NET应用程序中,默认行为是在发生未经处理的异常时退出。当异常未处理时,程序处于未知且可能不稳定的状态。仅仅因为它发生在后台线程中并不意味着错误不会影响程序的其余部分。在这种情况下,运行时最谨慎的做法是转储程序

您可以查看
AppDomain.CurrentDomain.UnhandledException
,这将允许您捕获未处理的异常并做出相应的反应。更好的解决方案是使用
try…catch
包装线程进程。但只有让它处理那些它知道如何处理的异常。这样做:

void MyThreadProc()
{
    try
    {
        // ... 
    }
    catch
    {
        // handle all exceptions
        // This is a BAD idea
    }
}
这是一个非常糟糕的主意,因为它可以屏蔽您确实希望传播到主程序的异常