アプリケーションにバックグラウンド スレッドがあります。スレッドの 1 つが処理されない例外を受け取ると、CLR 全体が終了します。
これは正常な動作ですか、それとも CLR のバグですか?
スレッドは終了すると思いますが、CLR は引き続き機能します。
アプリケーションにバックグラウンド スレッドがあります。スレッドの 1 つが処理されない例外を受け取ると、CLR 全体が終了します。
これは正常な動作ですか、それとも CLR のバグですか?
スレッドは終了すると思いますが、CLR は引き続き機能します。
.NET アプリケーションの既定の動作では、未処理の例外が発生すると終了します。例外が処理されない場合、プログラムは不明で不安定な状態になる可能性があります。バックグラウンド スレッドで発生したからといって、エラーがプログラムの残りの部分に影響を与えないわけではありません。そのような状況でのランタイムの最も賢明な方法は、プログラムをダンプすることです。
を調べてAppDomain.CurrentDomain.UnhandledException
、未処理の例外をキャッチし、それに応じて対応できるようにすることができます。より良い解決策は、スレッド proc を でラップすることtry...catch
です。ただし、処理方法を知っている例外のみを処理させます。これを行う:
void MyThreadProc()
{
try
{
// ...
}
catch
{
// handle all exceptions
// This is a BAD idea
}
}
これは、本当にメイン プログラムに伝播させたい例外をマスクする可能性があるため、非常に悪い考えです。
期待される動作は、1.1 での動作でした。それは一般的に悪い考えであると考えられていました。いずれかのスレッドで未処理の例外があると、プロセスが一貫性のない状態のままになる可能性があります。共有データへの更新は部分的に適用される場合があります。ランタイムには、このシナリオを安全に処理するための情報がなく、このシナリオをどのように処理したいかもわかっていないため、その選択はスレッドを終了させ、プログラムをそのままにしておくことになります。奇妙な状態。これにより、リソースのリーク、ハング、データの破損などが発生する可能性があります。未処理の例外が発生した場合にプロセスを終了すると、何が起こるかが正確にわかり、プロセスが終了します。
これは、v2.0 からの CLR の通常の動作です。これに関するMSDNの投稿を次に示します。プロセスが終了しないようにするには、次のようなものを使用できます
<legacyUnhandledExceptionPolicy enabled="1"/>
これはお勧めできません。
これは正常な動作です。おそらく、例外をキャッチして、アプリケーションが終了しないようにする必要があります。