2005年06月01日

UnhandledException

  
private void Run() {
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
threadMethodDelegate
= new ThreadMethodDelegate(ThreadMethod);
threadMethodDelegate.BeginInvoke("xyz",
new AsyncCallback(MyCallback), DateTime.Now);
}

private delegate bool ThreadMethodDelegate(string s);
private static ThreadMethodDelegate threadMethodDelegate;

private void Application_ThreadException(object sender,
ThreadExceptionEventArgs e) {
MessageBox.Show("例外が発生" + e.Exception.Message);
}

private bool ThreadMethod(string s) {
throw new ApplicationException("非同期デリゲートで何らかの例外が発生");
}

private void MyCallback(IAsyncResult ar) {
try {
bool result = threadMethodDelegate.EndInvoke(ar); //
} catch (Exception ex) {
// ここで、例外をスローしても、集約例外ハンドラで補足できない
// 次のように、UIスレッド上で、リスローすればOK
this.BeginInvoke(new RethrowExceptionDelegate(this.RethrowException),
new object[] {ex});
}
}

private delegate void RethrowExceptionDelegate(Exception ex);
private void RethrowException(Exception ex) {
throw new ApplicationException("タスクスレッドで例外発生",ex);
}


前回の続き。
では、非同期デリゲートの場合はという と、もし、非同期デリゲート内で例外が発生したとすると、前回の AppDomain.CurrentDomain.UnhandledException のイベントハンドラを設定しても、例外をキャッチできません。
例外をキャッチするには、非同期デリゲートの処理時に呼び出されるコールバックメソッドのなかで、例外をキャッチし、BiginInvokeメソッドを使い、非同期デリゲートを呼び出した側のUIスレッドのメソッド(ここでは、RethrowException)を起動します。この起動されたメソッドの方で、例外をスローさせて上げれば、例外をキャッチできます。



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/23832333