2009-08-07 8 views
0

異なるクラスで多くの非同期操作があります。非同期操作であるアクションが多い場合にWinFormsで例外をキャッチする方法

エラーの場合、System.Exceptionから継承された特別な例外がスローされます。
何らかの形で、私はmessageBoxでそれをキャッチしたいと思います。

"Application.ThreadException"関数はキャッチできません。

つまり、何らかの例外がスローされた場合、関数によってすべての例外をキャッチできません。 どうすればいいですか?

答えて

4

アプリケーションに登録.UnhandledExceptionは未処理の例外を発生させ、例外オブジェクトをEventArgsの詳細で公開します。

2

基本的には、スレッドごとに例外を処理し、最後にはApplication.ThreadExceptionを使用する必要があります。それを行うにはどのように

は、使用しているどのような非同期パターンに依存するが、例えばたIAsyncResultを使用した場合、例外はあなたのために「保存」されていて、EndIvoke(..、IAR)を呼び出したときにスロー

+0

たとえば、web.configにエラーデータを設定することによって、例外をキャッチしてasp.netのerrorpageにページをリダイレクトすることができます。 winformでの操作方法は? –

0

Henk Holtermanは既に例外を処理するよう提案しています。処理されていない厄介なものだけがApplication.ThreadExceptionのために残されるべきです。あなたが気づいていない場合は、Application.ThreadExceptionイベントハンドラメソッドでメッセージを表示することができますが、アプリケーションはを終了します。特定の例外はApplication.ThreadExceptionで検出されず、AppDomain.UnhandledExceptionイベントを処理する必要があります。 AFAIK非同期ハンドラで例外をスローするのは最善の方法です(私が間違っている場合はgurus、修正してください)。それらを処理する最善の方法は、ユーザー呼び出しの終了呼び出し時またはユーザーが応答オブジェクトの取得を試みるときに例外をスローすることです。あなたがthrow excのオブジェクトである場合、あるスレッドのオブジェクトであり、他のスレッドでは捕捉されませんのでご注意ください。したがって、メインスレッドに通知するには、レスポンスオブジェクトを渡すイベント(メインスレッドがフックしたイベント)を発生させる方法があります。エラーが発生した場合は、レスポンスオブジェクトのゲッターに例外を発生させます。それ以外の場合は、レスポンスオブジェクトを返します。もう1つの方法は、例外についてメインスレッドに通知するイベントを発生させることです。

EDIT: はちょうどあなたのコメントを見ました:

我々は例外をキャッチし、web.configファイル内のエラー・データを設定することにより、 asp.netでのerrorpageに ページをリダイレクトすることができます。 winformでの操作方法は?

winformsで直接実行する方法はありません。私がそれを行う方法は、スレッドごとに1つのHandleErrorメソッドがあります。このメソッドは、例外オブジェクトをパラメータとして受け取り、例外のタイプがメッセージボックスを表示し、および/またはログに記録するかどうかを検査します。

0

例外はMSDNのすべてのスレッドで一度に1つしか処理できないため、ASyncアプリケーションでは例外がありません。現在、イベント/デリゲートで処理できます。

VS2010には、マルチスレッド例外を処理するための新しい例外ハンドラがあります。

関連する問題