2010-11-26 16 views
22

次のイベントを使用して、メインのUIスレッドで未処理の例外をキャッチしています。別のスレッドで未処理の例外をキャッチ

Application.ThreadException 

残念ながら、別々のスレッドで未処理のエラーを検出することはありません。私はしかし、これは前者がない場所として、トリガー時にアプリケーションをシャットダウンするようだ

AppDomain.CurrentDomain.UnhandledException 

の承知しています。

アプリケーションが終了せずに、別のスレッドで未処理の例外を処理する方法はありますか?

+6

はい、あなたのスレッドが例外をスロー未処理していないことを確認してください。 Eric Lippert氏は次のように述べています。「処理されない例外はすべて、致命的な例外または処理されていない例外であると想定するのが最も安全です。どちらの場合でも、すぐに処理を取りやめることです。 http://blogs.msdn.com/b/ericlippert/archive/2010/11/23/asynchrony-in-c-5-part-eight-more-exceptions.aspx – Ani

+4

あなたはその記事の最も重要な部分を忘れていました:リプリーが言ったように、事態がうまくいかないときは、軌道からサイト全体を離陸して核兵器を破壊する必要があります。「 –

答えて

21

@Aniは既にあなたの質問に答えています。私は、スレッドの未処理例外がアプリケーションを終了する必要があることに同意しませんが。スレッドを使用すると、通常、何らかの種類のサーバーアプリケーションがあることを意味します。それを取り下げると、多くの怒っているユーザーになる可能性があります。

私は、適切な例外処理についての小片を書いた:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

あなたは常にスレッドの例外をキャッチする必要があります。それは別々のメソッドにロジックを移動することで、適切に例外を処理していないスレッドの方法を見つけて、ちょうどスレッド方式でtry/catchブロックを保つためにずっと簡単です

void ThreadMethod(object state) 
    { 
     try 
     { 
      ActualWorkerMethod(); 
     } 
     catch (Exception err) 
     { 
      _logger.Error("Unhandled exception in thread.", err); 
     } 
    } 

    void ActualWorkerMethod() 
    { 
     // do something clever 
    } 

:私は通常、次のパターンを使用します。

+0

ありがとうございます。 –

+1

他のスレッドの未処理の例外が、使用しているサードパーティコンポーネントのプライベートな非同期メソッドによって呼び出された場合、どうすればそれを回避できますか? – MC5

+0

サードパーティのライブラリが何らかの方法を提供していない限り、できません。非同期メソッド(Begin/End)に関してはcatchを使う必要があります。しかし、 'AppDomain.UnhandledException'イベントを使って例外をキャッチすることはできますが、アプリケーションをレスキューすることはできません。 – jgauffin

1

はい、手動で例外をスレッドで捕捉する必要があります。

しかし、このコード:

void ThreadMethod(object state) 
{ 
    try 
    { 
     ActualWorkerMethod(); 
    } 
    catch (Exception err) 
    { 
     _logger.Error("Unhandled exception in thread.", err); 
    } 
} 

void ActualWorkerMethod() 
{ 
    // do something clever 
} 

PostSharpを使用して、このように単純化することができます。

[LogExceptions] 
void ActualWorkerMethod() 
{ 
    // do something clever 
}