2012-05-04 30 views
2

私のRunWorkerCompletedハンドラ内のDoWorkハンドラ内で発生する例外を処理したいのですが、コードがデバッガで実行されている間、最初に "Exeption was unhandled by user code"が発生します。BackgroundWorkerのDoWorkハンドラからスローされた例外を処理する方法は?

コードのここでは簡単な例私が使用しています:私は間違って何をやっている

BackgroundWorker _worker; 
public void Test() 
{ 
    _worker = new BackgroundWorker(); 
    _worker.WorkerReportsProgress = false; 
    _worker.WorkerSupportsCancellation = false; 

    _worker.DoWork += new DoWorkEventHandler(bw_DoWork); 
    _worker.RunWorkerCompleted += new 
     RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
    _worker.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    e.Result = ActuallWorkHere(); 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var t = e.Error; 
} 

private IEnumerable<string> ActuallWorkHere() 
{ 
    throw new Exception("test"); 
    // "Exeption was unhandled by user code" if called 
    string[] res = { "test" }; 
    return res; 
} 

?あなたは本当に何も悪いことをやっていない

+1

正確に例外はありますか?私はあなたのコードで一回の試行を見たことはありません! – banging

+1

"exeptiong first"は "first chance exception"を読みます。これは正常ですが、例外はDoWorkを呼び出すコードによって捕捉されます。あなたがRunWorkerCompletedでそれをどうするのかはあなた次第です。たとえば、if(e.Error!= null)throw e.Error;と書くことができます。 –

答えて

4

、これは、デバッガでコードを実行するときにVisual Studioが未処理のエラーで何をするかです:MSDNのBackgroundWorker.DoWork Eventから

あなたは下で実行されている場合Visual Studioデバッガでは、デバッガは処理されない 例外が発生したDoWorkイベントハンドラ内のポイントでデバッガ を破棄します。

コンパイルしたプログラムを実行してみてください。これは表示されません。

DoWorkでこの例外を処理でき、RunWorkerCompletedハンドラのRunWorkerCompletedEventArgs.Errorプロパティにもエラーの詳細が格納されることに注意してください。

関連する問題