【问题标题】:CLR exits when a thread gets unhandled exception当线程得到未处理的异常时,CLR 退出
【发布时间】:2011-01-30 15:25:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net clr unhandled-exception


    【解决方案1】:

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

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

    void MyThreadProc()
    {
        try
        {
            // ... 
        }
        catch
        {
            // handle all exceptions
            // This is a BAD idea
        }
    }
    

    这是一个非常糟糕的主意,因为它可以掩盖您确实希望传播到主程序的异常。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是从 v2.0 开始的 CLR 的正常行为。这是关于此的MSDN 帖子。为了避免进程终止,你可以使用这样的东西

        <legacyUnhandledExceptionPolicy enabled="1"/>
        

        这是不可取的。

        【讨论】:

          【解决方案4】:

          这是正常行为。也许您想捕获异常以防止应用程序退出。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-01
            • 1970-01-01
            • 2012-09-06
            • 1970-01-01
            • 1970-01-01
            • 2010-10-10
            • 1970-01-01
            相关资源
            最近更新 更多