[解決済み】WPFアプリケーションで例外をグローバルにキャッチする?
質問
WPFアプリケーションの一部で、実行時に例外をスローすることがあります。処理されない例外をグローバルにキャッチしてログに記録し、それ以外は何事もなかったかのようにプログラムの実行を続けたいと考えています(VBの
On Error Resume Next
).
これはC#で可能なのでしょうか?また、その場合、具体的にどこに例外処理コードを置く必要があるのでしょうか?
現状では
try
/
catch
を囲んで、発生しうるすべての例外をキャッチすることになります。そしてその場合でも、キャッチのために実行されたものはすべて残しておくことになります。それとも、私はここで恐ろしく間違った方向で考えているのでしょうか?
ETAです。 下の方で多くの方が指摘されていましたので。このアプリケーションは、原子力発電所を制御するためのものではありません。クラッシュしても大したことはないのですが、UIに関連したランダムな例外が発生するのは、使用する状況としては迷惑な話です。プラグインアーキテクチャを使用しているため、他の人が拡張する可能性があります(その場合、学生でもあります。 いいえ 完全にエラーのないコードを書くことができる経験豊富な開発者)。
捕捉される例外については 例外が発生した場合は、スタックトレースを含めてログファイルに記録しています。それがこの演習の目的でした。VBのOERNへの私のアナロジーを文字通りに受け取りすぎている人たちに対抗するためにね。
ある種のエラーをやみくもに無視することは危険であり、私のアプリケーションのインスタンスを破壊するかもしれないことは分かっています。前にも言ったように、このプログラムは誰かにとってミッションクリティカルなものではありません。まともな神経の持ち主なら、人類の文明の存続をこれに賭けることはないでしょう。これは単に、ソフトウェア工学に関するある種の設計手法をテストするための小さなツールなのです。
このアプリケーションをすぐに使う場合、例外が発生する可能性はあまりありません。
- 例外処理なし - エラーダイアログとアプリケーションの終了。実験は繰り返さなければならないが、おそらく別の被験者で行うことになる。エラーは記録されていないのが残念である。
- 一般的な例外処理 - 良好なエラーがトラップされ、害はない。これは、私たちが開発中に見たすべてのエラーから判断して、一般的なケースであるべきです。この種のエラーを無視しても、すぐに影響は出ないはずです。中核となるデータ構造は十分にテストされているので、簡単に生き残ることができます。
- 一般的な例外処理 - 重大なエラーが発生し、後の時点でクラッシュする可能性があります。これは稀に起こるかもしれない。今のところ一度も見たことがない。エラーはとにかく記録され、クラッシュは避けられないかもしれません。つまり、これは最初のケースと概念的に似ています。スタックトレースがあることを除けば。そして、ほとんどの場合、ユーザーはそのことに気づきもしないでしょう。
プログラムが生成する実験データについては。重大なエラーが発生した場合、最悪の場合、データが記録されないだけです。実験結果が微妙に変化するようなことは、まずないでしょう。また、そのような場合でも、結果が疑わしい場合はエラーが記録され、そのデータポイントが完全に異常値であれば捨てることができます。
まとめますと。そう、私は自分がまだ少なくとも部分的には正気だと考えているし、プログラムを実行したままにしておくグローバルな例外処理ルーチンが必ずしも完全に悪だとは考えていないのです。前にも2回言ったように、用途によってはそのような判断も有効かもしれません。この場合、それは有効な判断であり、全くのでたらめではないと判断されたのです。 他のアプリケーションでは、その判断は異なるかもしれません。 でも、エラーを無視しているからといって、私やそのプロジェクトに携わった他の人たちを、世界を吹き飛ばすかもしれないと非難するのはやめてください。
余談ですが、そのアプリケーションのユーザーはまさに一人です。WindowsやOfficeのように何百万人もが使うようなものではありませんから、例外がユーザーに全く伝わらないというのは、そもそもすでにコストが大きく違ってくるのです。
解決方法は?
を使用します。
Application.DispatcherUnhandledException Event
. 参照
この質問
をご覧ください。
ドリュー・ノークスの回答
).
スタックオーバーフロー、メモリ枯渇、データベースへの保存中にネットワーク接続が切断された場合など、アプリケーションを正常に再開できない例外が発生する可能性があることを認識しておいてください。
関連
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] 投げる」と「投げる元」は違うのですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Node.jsの例外処理のベストプラクティス
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] WPFのグローバル例外ハンドラ [重複]について