例外はブロッキングエラーです。
まず第一に、ベストプラクティスは、ブロッキングエラーでない限り、あらゆる種類のエラーに対して例外をスローしないことです。です。
エラーがブロックしている場合、例外をスローします。例外が既にスローされている場合は、例外であるため、非表示にする必要はありません。ユーザーにそのことを知らせます(UIで、例外全体をユーザーにとって有用なものに再フォーマットする必要があります)。
ソフトウェア開発者としてのあなたの仕事は、いくつかのパラメーターまたはランタイム状況が例外で終了する可能性がある例外的なケースを防ぐように努めることです。つまり、例外をミュートしてはいけませんが、これらは回避する必要があります。
たとえば、一部の整数入力に無効な形式が含まれる可能性があることがわかっている場合は、int.TryParse
代わりにint.Parse
。「失敗した場合は単に例外をスローする」とだけ言うのではなく、これを実行できるケースがたくさんあります。
例外のスローは高価です。
結局のところ、例外がスローされた場合、いったんスローされたログにログを書き込むのではなく、ベストプラクティスの1つは、初回例外ハンドラでキャッチすることです。例えば:
- ASP.NET:Global.asaxののApplication_Error
- その他:AppDomain.FirstChanceExceptionイベント。
私のスタンスは、ローカルのtry / catchesは、例外を別の例外に変換する可能性がある特別なケース、または非常に、非常に、非常に非常に非常に特別なケース(ライブラリバグバグ全体を回避するためにミュートする必要がある無関係な例外をスローします)。
残りの場合:
- 例外を避けてください。
- これが不可能な場合:初回例外ハンドラー。
- または、PostSharpアスペクト(AOP)を使用します。
コメントで@thewhiteambitに答える...
@thewhiteambitさんのコメント:
例外は致命的なエラーではなく、例外です。時々それらはエラーでさえないが、それらを考慮することは致命的エラーは例外が何であるかについて完全に誤った理解である。
まず、どのようにして例外がエラーになることはありませんか?
- データベース接続なし=>例外。
- あるタイプに解析するための無効な文字列フォーマット=>例外
- JSONを解析しようとしていますが、入力は実際にはJSON =>例外ではありません
null
オブジェクトが期待されている間の引数=>例外
- 一部のライブラリにはバグがあります=>予期しない例外をスローします
- ソケット接続があり、切断されます。次に、メッセージを送信しようとします=>例外
- ...
例外がスローされた場合の1kのケースをリストする場合があり、結局のところ、考えられるケースのいずれかがエラーになります。
例外はエラーです。1日の終わりにそれは診断情報を収集するオブジェクトであるためです。これにはメッセージがあり、何かがうまくいかないときに発生します。
例外的なケースがない限り、誰も例外をスローしません。例外がスローされると、例外をブロックする必要があります。制御フローを実装するためにtry / catchと例外を使用しないと、アプリケーション/サービスが例外的なケースに入った操作を停止するためです。
また、Martin Fowlerが発行した(Jim Shoreが作成した)フェイルファストパラダイムをすべての人に確認することをお勧めします。これは、少し前にこのドキュメントに到達する前でも、常に例外の処理方法を理解していた方法です。
[...]致命的エラーとは、例外とは何かについての完全な誤解です。
通常、例外は一部の操作フローを削減し、人間が理解できるエラーに変換するように処理されます。したがって、例外は実際にはエラーのケースを処理し、アプリケーション/サービスの完全なクラッシュを回避してユーザー/コンシューマに問題が発生したことを通知するために取り組むためのより良いパラダイムのようです。
@thewhiteambitの懸念に関するその他の回答
たとえば、Database-Connectionが見つからない場合、プログラムは例外的にローカルファイルへの書き込みを続行し、データベースが再び利用可能になったときに変更をデータベースに送信できます。無効な文字列から数値へのキャストは、Parse( "1,5")へのデフォルトの英語を試すのに失敗し、完全にドイツ語の解釈でもう一度試すように、例外で言語ローカルの解釈を使用して再度解析しようとする可能性があります。区切り記号としてポイントの代わりにカンマを使用しているため、問題ありません。これらの例外はブロッキングであってはならず、いくつかの例外処理のみが必要であることがわかります。
データをデータベースに永続化せずにアプリがオフラインで動作する可能性がある場合は、例外を使用しないでください。使用して制御フローを実装することtry/catch
はアンチパターンと見なされます。オフラインでの作業は考えられるユースケースであるため、データベースにアクセスできるかどうかを確認するための制御フローを実装し、到達不能になるまで待機しません。
解析することも予想される場合(あるCASE例外ではありません)。これが予想される場合は、例外を使用してフローを制御しないでください。。ユーザーからメタデータを取得して、彼/彼女の文化が何であるかを知り、フォーマッターを使用します!.NETはこの環境と他の環境もサポートします。アプリケーション/サービスのカルチャ固有の使用法が予想される場合は数値のフォーマットを回避する必要があるため、例外があります。
未処理の例外は通常エラーになりますが、例外自体はcodeproject.com/Articles/15921/Not-All-Exceptions-Are-Errorsではありません
この記事は、著者の意見または見解です。
ウィキペディアも記事の著者の意見にすぎない可能性があるので、私はそれはそうではありません がドグマであるが、例外によるコーディングの記事がいくつかの段落のどこかで言っていることを確認してください:
[...]これらの例外を使用して、プログラムを続行するために発生する特定のエラーを処理することを、例外によるコーディングと呼びます。このアンチパターンは、ソフトウェアのパフォーマンスと保守性をすぐに低下させる可能性があります。
それはまたどこかで言う:
誤った例外の使用法
多くの場合、例外によるコーディングは、誤った例外の使用を伴うソフトウェアのさらなる問題につながる可能性があります。一意の問題に対して例外処理を使用することに加えて、不正な例外の使用は、例外が発生した後でもコードを実行することにより、これをさらに進めます。この貧弱なプログラミング方法は、多くのソフトウェア言語のgotoメソッドに似ていますが、ソフトウェアの問題が検出された後にのみ発生します。
正直なところ、ソフトウェアを開発することはできませんが、ユースケースを真剣に受け止めていないと思います。あなたがそれを知っているなら...
- データベースがオフラインになる可能性があります...
- 一部のファイルはロックできます...
- 一部のフォーマットがサポートされていない可能性があります...
- 一部のドメイン検証が失敗する可能性があります...
- アプリはオフラインモードで動作するはずです...
- どんなユースケースでも ...
... そのために例外を使用しません。あなたはサポートします、通常の制御フローを使用して、これらのユースケースを。
また、予期しない使用例がカバーされていない場合、例外がスローされるため、コードはすぐに失敗します。そうです、例外は例外的なケースだからです。
一方では、最終的に、時にはあなたはカバー例外的なケース投げ期待例外をしますが、制御フローを実装するためにそれらをスローしません。これは、一部のユースケースをサポートしていないこと、またはコードが特定の引数または環境データ/プロパティで機能しないことを上位レイヤーに通知するためです。