2009-10-21 11 views
23

C#プログラムは、次のように呼び出されます。C#全体のプログラムをtry/catchすることは可能ですか?

Application.Run (new formClass()); 

すべてのキャッチされていない例外をトラップするためにtry/catchを使用したいと思います。このRunメソッドの周りに置くと、例外は捕捉されません。制御は、キャッチされない例外の後にプログラムが終了したときにのみここに戻ります。

プログラム全体をカバーするためにtry/catchをどこに置くことができますか?ありがとう!

+4

私は、例外がアプリケーションの一番上のレイヤーに吹き飛ばされ、次にコード内のより低いものに対処する必要がある何か間違っている場合に、例外処理のポイントを見逃していると思います。 try/catchを失敗の可能性があるコードの周りに置き、catch(可能な場合)をcatchに提供します。それが緩和できない、つまりアプリが回復できない場合、アプリケーションは失敗する必要があります。 – Lazarus

+13

OPは例外の使用方法を尋ねるのではなく、特定のシナリオで例外を捕捉する方法だけです。明らかに例外がトップレイヤーにバブルすると、何かが間違っている - 何かが間違っているときに情報を見つけたいので、対処できるようです。ミッチの答えは、彼が何をやっているのかわからないと仮定するよりはるかに役立ちます。 – Maggie

+9

トップレベルですべての例外をキャッチすることは、終了する前に何が起こったのかを最終的に報告するのに非常に役立ちます。多くの場合、これは標準Windowsの「このプログラムがクラッシュしたので、これをMicrosoftに報告してください」というダイアログが表示された方が良いと思います。 – noctonura

答えて

37

Windowsフォームの未処理の例外をキャッチするには、 AppDomain.UnhandledExceptionApplication.ThreadExceptionイベントを接続します。

興味深いの

:デフォルトのCLRのホスティングプロセスを使用した場合Unexpected Errors in Managed Applications

+2

@alankdkd:最後と "いくつかのベストプラクティス"セクションを読んでください) – Lazarus

+1

'AppDomain.UnhandledException'で例外をキャッチすることはできません(アプリケーションは終了しますが)通知されます。これは例外キャッチである 'Application.ThreadException'と比較して重要な違いです。 – Lucero

+0

UnhandledExceptionを動作させることができません。私は試しました: 例外がある場合、MyHandlerは決して呼び出されません。 ThreadExceptionを試行します... – user20493

8

基本的に、あなたはすべての例外をキャッチすることはできません。期間。これは、AppDomain.UnhandledExceptionイベントが通知のみであるため、例外を処理できないためです(つまり、通知の処理後にアプリケーションが終了することを防ぐことはできません)。

しかし、Application.ThreadExceptionハンドラ(control the behaviorUnhandledExceptionMode)を使用すると、WinFormsアプリケーションのUIスレッドですべての例外をキャッチして処理できます。例外をスローする他のスレッドは、このハンドラによって捕捉されません。

一般に、すべての例外を処理して処理することはお勧めできません。ただし、 AppDomain.UnhandledExceptionを使用してエラーをログに記録したり、重要なクリーンアップタスク(ファイルベースのデータベースなどのシャットダウンなど)を行うことができます。

関連する問題