1. ホーム
  2. c#

[解決済み】WPFアプリケーションで例外をグローバルにキャッチする?

2022-04-04 15:11:40

質問

WPFアプリケーションの一部で、実行時に例外をスローすることがあります。処理されない例外をグローバルにキャッチしてログに記録し、それ以外は何事もなかったかのようにプログラムの実行を続けたいと考えています(VBの On Error Resume Next ).

これはC#で可能なのでしょうか?また、その場合、具体的にどこに例外処理コードを置く必要があるのでしょうか?

現状では try / catch を囲んで、発生しうるすべての例外をキャッチすることになります。そしてその場合でも、キャッチのために実行されたものはすべて残しておくことになります。それとも、私はここで恐ろしく間違った方向で考えているのでしょうか?

ETAです。 下の方で多くの方が指摘されていましたので。このアプリケーションは、原子力発電所を制御するためのものではありません。クラッシュしても大したことはないのですが、UIに関連したランダムな例外が発生するのは、使用する状況としては迷惑な話です。プラグインアーキテクチャを使用しているため、他の人が拡張する可能性があります(その場合、学生でもあります。 いいえ 完全にエラーのないコードを書くことができる経験豊富な開発者)。

捕捉される例外については 例外が発生した場合は、スタックトレースを含めてログファイルに記録しています。それがこの演習の目的でした。VBのOERNへの私のアナロジーを文字通りに受け取りすぎている人たちに対抗するためにね。

ある種のエラーをやみくもに無視することは危険であり、私のアプリケーションのインスタンスを破壊するかもしれないことは分かっています。前にも言ったように、このプログラムは誰かにとってミッションクリティカルなものではありません。まともな神経の持ち主なら、人類の文明の存続をこれに賭けることはないでしょう。これは単に、ソフトウェア工学に関するある種の設計手法をテストするための小さなツールなのです。

このアプリケーションをすぐに使う場合、例外が発生する可能性はあまりありません。

  • 例外処理なし - エラーダイアログとアプリケーションの終了。実験は繰り返さなければならないが、おそらく別の被験者で行うことになる。エラーは記録されていないのが残念である。
  • 一般的な例外処理 - 良好なエラーがトラップされ、害はない。これは、私たちが開発中に見たすべてのエラーから判断して、一般的なケースであるべきです。この種のエラーを無視しても、すぐに影響は出ないはずです。中核となるデータ構造は十分にテストされているので、簡単に生き残ることができます。
  • 一般的な例外処理 - 重大なエラーが発生し、後の時点でクラッシュする可能性があります。これは稀に起こるかもしれない。今のところ一度も見たことがない。エラーはとにかく記録され、クラッシュは避けられないかもしれません。つまり、これは最初のケースと概念的に似ています。スタックトレースがあることを除けば。そして、ほとんどの場合、ユーザーはそのことに気づきもしないでしょう。

プログラムが生成する実験データについては。重大なエラーが発生した場合、最悪の場合、データが記録されないだけです。実験結果が微妙に変化するようなことは、まずないでしょう。また、そのような場合でも、結果が疑わしい場合はエラーが記録され、そのデータポイントが完全に異常値であれば捨てることができます。

まとめますと。そう、私は自分がまだ少なくとも部分的には正気だと考えているし、プログラムを実行したままにしておくグローバルな例外処理ルーチンが必ずしも完全に悪だとは考えていないのです。前にも2回言ったように、用途によってはそのような判断も有効かもしれません。この場合、それは有効な判断であり、全くのでたらめではないと判断されたのです。 他のアプリケーションでは、その判断は異なるかもしれません。 でも、エラーを無視しているからといって、私やそのプロジェクトに携わった他の人たちを、世界を吹き飛ばすかもしれないと非難するのはやめてください。

余談ですが、そのアプリケーションのユーザーはまさに一人です。WindowsやOfficeのように何百万人もが使うようなものではありませんから、例外がユーザーに全く伝わらないというのは、そもそもすでにコストが大きく違ってくるのです。

解決方法は?

を使用します。 Application.DispatcherUnhandledException Event . 参照 この質問 をご覧ください。 ドリュー・ノークスの回答 ).

スタックオーバーフロー、メモリ枯渇、データベースへの保存中にネットワーク接続が切断された場合など、アプリケーションを正常に再開できない例外が発生する可能性があることを認識しておいてください。