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