2013-12-14 20 views
8

例外を処理する方法について少し混乱しています。バックグラウンドワーカー例外処理

私はいくつかの長い実行中のプロセスを実行するバックグラウンドワーカースレッドを持っています。私の理解は、バックグラウンドワーカースレッドで例外が発生した場合、コードはまだRunWorkerCompletedメソッドで終了します。

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw e.Error; 

この場合、bgWorker.RunWorkerAsync();の周りにtry catchブロックを置くことができます。コール、私はないと思いますか?

私はRunWorkerCompleted方法でキャッチされた例外を再スローしたい、どのように私は、スタックトレースを失うことなくこれを行うことができます - 私は正しいの上に持っているものでしょうか?例外を取り返したときに「スロー」を使うべきだと私はあなたに読んでいますか?

答えて

13

ような何かを行うことができます。そのスタックトレースを

private void bgWorker_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
     throw new BusinessSpecificException("Operation failed", e.Error); 
    // ... 
} 

このように元の例外が利用できるようになります、そして、あなたはより記述例外がスローされています:そして、内部例外として、元の例外を除いて、この例外をスローします。

注 - 新しい例外クラスを作成したくない場合は、既存のApplicationExceptionまたはExceptionを使用できます。しかし、そのないよう、有益で、あなたがどこかにそれをキャッチしようとしている場合は、あなただけの

2

If this is the case is there any point in putting a try catch block around the bgWorker.RunWorkerAsync(); call, I assume not?

それは方法(ないan event)ですbgWorker.RunWorkerAsync();ので、あなたがこれを行うことはできませんありません。 Visual Studioデバッガで実行している場合、デバッガは処理されない例外が発生したDoWorkイベントハンドラのポイントで中断します。 だから、私はあなたがバックグラウンドでやっていた操作を説明するいくつかのビジネスの特定の例外を作成することをお勧めこの

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       //put your break point here 
       // here you can capture your exception 
      } 
      catch (Exception ex) 
      { 
       // here catch your exception and decide what to do     
       throw; 
      } 



     } 
+0

を試してみて、この特定の例外をキャッチすることができないでしょうRunWorkerCompletedメソッドでエラー処理を行う必要がありますか? RunWorkerCompletedメソッドのエラーを処理する方がよいでしょうか? – mHelpMe

+0

ワーカースレッドで例外を処理すると、RunWorkerCompletedで取得できなくなり、DoWorkで処理できない場合は、何か問題があった場合にアプリケーションがクラッシュする可能性があります –

7

はので、このケースでは、私はないでしょう。この

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw new Exception("My Custom Error Message", e.Error);