1

次のコンソールアプリケーションがあるとしましょう。

Thread thread = new Thread(new ThreadStart(() => { throw new Exception(); }));
thread.IsBackground = true;
thread.Start();

while (true)
  Console.WriteLine("Hello from main thread");

バックグラウンドトレッドの例外が原因でアプリケーション全体がクラッシュしないようにすることは可能ですか(もちろんtry..catchを使用せずに)?

4

4 に答える 4

6

未処理の例外ハンドラーを添付します:http: //msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

グローバルハンドラーを使用して目的の結果を達成するためのより良い方法(OK、try / catchを使用しますが、1回のみ):

    public static void GlobalHandler(ThreadStart threadStartTarget)
    {
        try
        {
            threadStartTarget.Invoke();
        }
        catch (Exception ex)
        {
             //handle exception here
        }
    }

そして、スレッドを開始します。

        Thread thread = new Thread(o => GlobalHandler(ThreadMethod));
        thread.Start();

PSしかし、実際には、すべての例外をキャッチするという考えは好きではありません。それはほとんど決して良い考えではありません。

于 2012-11-26T09:26:17.267 に答える
0

ThreadPoolスレッドを使用できます。

于 2012-11-26T09:28:08.683 に答える
0

手に負えない例外を隠して忘れるのは良い習慣ではないので、そうしないでください。

try / catchを使用したくない理由はわかりませんが、状況を処理するための最良の方法です。その場合は、可能であれば例外を修正するか、少なくとも後で確認するためにログに記録する必要があります。

于 2012-11-26T09:30:11.123 に答える
0

未処理の例外をグローバルにキャッチできる場合でも、キャッチできるが処理できない例外がいくつかあることに注意する必要があります。StackoverflowExceptionは、例外を処理するのに十分なスタックスペースを残さない場合があります。OutOfMemoryと同じです。大きな物を入れるのに十分なスペースがないかもしれませんが、スペースがまったく残っていない可能性もあります。
したがって、通常は、処理できるこれらの例外(filenotfound、accessviolationなど)をキャッチして処理し、他のすべての例外をアプリのクラッシュに任せる(未定義の状態で続行するよりもクラッシュする)コードを記述します。未処理の例外で実行できる唯一のことは、アプリを正常に閉じて(変更を保存したり、エラーログを書き込んだりするなど)、例外を再スローすることです。

于 2012-11-26T09:39:21.247 に答える