39
4

11 に答える 11

44

イベント ハンドラーを AppDomain.UnhandledException イベントに追加すると、例外がスローされてキャッチされなかったときに呼び出されます。

于 2008-09-17T12:21:57.047 に答える
28

他の人が投稿したこととは反対に、すべての例外をキャッチしても問題はありません。重要なことは、それらすべてを適切に処理することです。スタック オーバーフローまたはメモリ不足の状態が発生した場合、アプリはシャットダウンする必要があります。また、OOM 条件によって、例外ハンドラーが正しく実行されなくなる可能性があることに注意してください。たとえば、例外ハンドラーが例外メッセージを含むダイアログを表示する場合、メモリが不足していると、ダイアログを表示するための十分なスペースが残っていない可能性があります。ログに記録してすぐにシャットダウンすることをお勧めします。

他の人が述べたように、そうでなければ見逃される可能性のあるコレクションの例外を処理できる UnhandledException および ThreadException イベントがあります。次に、メイン ループの周りに例外ハンドラーをスローするだけです (winforms アプリを想定)。

また、OutOfMemoryExceptions は、メモリ不足の状態で常にスローされるとは限らないことに注意してください。OOM 条件は、コード内またはフレームワーク内であらゆる種類の例外をトリガーする可能性があります。これらの例外は、実際の基になる条件がメモリ不足であるという事実とは必ずしも関係ありません。根本的な原因が実際にはメモリ不足である場合に、InvalidOperationException または ArgumentException を頻繁に見てきました。

于 2008-09-17T14:44:28.747 に答える
11

ホストのJeffAtwoodによるcodeprojectのこの記事 は、あなたが必要としているものです。未処理の例外をキャッチするためのコードと、クラッシュに関する情報をユーザーに表示するための最良の方法が含まれています。

于 2008-09-17T13:46:35.470 に答える
10

Global.asaxクラスは、最後の防衛線です。見る:

protected void Application_Error(Object sender, EventArgs e)

方法

于 2008-09-17T12:24:32.173 に答える
6

一部の例外はキャッチするのが危険であることに注意してください-またはほとんどキャッチできません。

  • OutOfMemoryException: catch ハンドラーで何かを行うと、(CLR のマネージまたはアンマネージ側で) メモリが割り当てられ、別の OOM がトリガーされる可能性があります。
  • StackOverflowException: CLR がそれを十分に早く検出したかどうかによっては、通知される場合があります。最悪の場合、単純にプロセスを強制終了します。
于 2008-09-17T12:43:15.373 に答える
4

AppDomain.CurrentDomain.UnhandledException を使用してイベントを取得できます。

于 2008-09-17T12:23:57.773 に答える
4

例外を適切に処理する計画を立てずにすべての例外をキャッチすることは確かに悪い習慣ですが、アプリケーションは何らかの適切な方法で失敗するべきだと思います。クラッシュはユーザーを怖がらせて死ぬべきではありません。少なくとも、エラーの説明、技術サポート担当者に報告するための情報、および理想的にはアプリケーションを閉じて再起動するためのボタンを表示する必要があります。理想的な世界では、アプリケーションはユーザー データをディスクにダンプし、それを回復しようとする必要があります (ただし、これは要求が多すぎることがわかります)。

とにかく、私は通常使用します:

AppDomain.CurrentDomain.UnhandledException
于 2008-09-17T14:21:55.167 に答える
3

Application.ThreadException イベントを使用することもできます。

COM ベースのアプリケーション内で実行される .NET アプリケーションを開発したことがあります。この場合、AppDomain.CurrentDomain.UnhandledException が機能しなかったため、このイベントは非常に役立ちました。

于 2008-09-17T12:27:08.580 に答える
1

すべての Exception をキャッチするのではなく、ユーザーに表示する方がよいと思います。これは、実際に処理できる例外のみをキャッチする必要があるためです。プログラムを停止させ、それでもそれをキャッチする何らかの例外が発生した場合、これはさらに深刻な問題を引き起こす可能性があります。FAQ: FxCopが catch(Exception) に対して警告するのはなぜですか? .

于 2008-09-17T12:29:19.697 に答える
1

これらの未処理の例外をキャッチすると、アプリケーションのセキュリティ要件が変わる可能性があることに注意してください。特定のコンテキスト (ネットワーク共有から実行する場合など) では、アプリケーションが正しく動作しなくなる場合があります。十分にテストしてください。

于 2008-09-17T13:43:15.150 に答える
0

AppDomain.CurrentDomain.UnhandledException Application.ThreadException の両方を使用しても害はありません

ただし、セカンダリ スレッドの例外はこれらのハンドラーによってキャッチされないことに注意してください。必要に応じてセカンダリ スレッドにSafeThreadを使用する

于 2008-11-20T18:05:11.440 に答える