2012-05-05 23 views
4

次のコードを使用して、プログラム内のすべての未処理の例外を処理しています。しかし、例外が指定されたメソッドに伝播しないという問題。未処理の例外がC#で捕捉されない

[STAThread] 
    static void Main() 
    { 


     AppDomain currentDomain = default(AppDomain); 
     currentDomain = AppDomain.CurrentDomain; 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
     // Handler for unhandled exceptions. 
     currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
     // Handler for exceptions in threads behind forms. 
     System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 


     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new FormMain()); 
    } 

    private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
    { 
     Exception ex = (Exception)e.ExceptionObject;   

     MessageBox.Show(ex.Message, 
            "Important", 
            MessageBoxButtons.YesNo); 
    } 

    private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
    { 
     Exception ex = e.Exception; 

     MessageBox.Show(ex.Message, 
           "Important", 
           MessageBoxButtons.YesNo); 

    } 

FormMainにはbackgroundWorkerオブジェクトがあります。このバックグラウンドワーカーは、アプリの大半を占めるもので、doWorkメソッドに例外があると、予期したとおりに伝播されません。 これは、私がメインフォームで使用しているバックグラウンドワーカーのコードです。

private void button_startSync_Click(object sender, EventArgs e) 
{    
    backgroundWorker1.RunWorkerAsync(getSettings());\   
} 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    {   

    // ... processing code 
    // Unhandled Exception will generated in this method...   
    } 

私がここで間違って何をやってお知らせくださいERRO /例外が固定のために戻って報告するように、私は...、私のプログラムの任意の場所で発生した例外は上記のものをグローバルハンドラに巻き込まれたく

感謝、

答えて

7

これは仕様によるもので、BackgroundWorkerクラスはDoWorkイベントハンドラ内でスローされた例外をキャッチします。そして、それをRunWorkerCompletedイベントハンドラのe.Errorプロパティで公開します。したがって、次のように書いてください。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
    { 
     if (e.Error != null) throw e.Error; 
     // etc.. 
    } 
+1

私はあなたがWorkedCompletedでこれを行うことを意味すると思います。 DoWorkEventArgsにはErrorプロパティがありません。 – Ahmed

+0

私は、間違ったコードをコピー/貼り付けました。ありがとう。 –