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