私が見たほとんどすべての Java / C# コードの例外処理が正しくないため、ここに追加したいと思います。つまり、無視された例外のエラーをデバッグするのが非常に困難になるか、または同様に悪いことに、何も言わないあいまいな例外が発生します。
まず、例外は、コード レイヤー間でエラー情報を簡単に返す方法であることを理解してください。ここで、間違い 1: レイヤーは単なるスタック フレームではなく、明確に定義された責任を持つコードです。という理由だけでインターフェイスと impl をコーディングしただけなら、もっと良い修正が必要です。
レイヤーが適切に設計されていて、特定の責任がある場合、エラーの情報はバブルアップするため、異なる意味を持ちます。<-これが何をすべきかの鍵であり、普遍的なルールはありません。
したがって、これは、例外が発生したときに 2 つのオプションがあることを意味しますが、レイヤーのどこにいるのかを理解する必要があります。
A) レイヤーの途中にいて、内部の、通常はプライベートなヘルパー関数で、何か問題が発生した場合: 心配しないで、呼び出し元に例外を受け取ってもらいます。ビジネスコンテキストがなく、1) エラーを無視していないため、完全に問題ありません。2) 呼び出し元はレイヤーの一部であり、これが発生する可能性があることを知っている必要がありますが、下でそれを処理するコンテキストがない可能性があります。
また ...
B) あなたはレイヤーの最上部の境界であり、内部へのファサードです。次に、例外が発生した場合、デフォルトは CATCH ALL になり、呼び出し元にとって意味のない特定の例外が上位層に渡らないようにするか、さらに悪いことに、変更する可能性があり、呼び出し元は実装に依存します。詳細と両方が壊れます。
アプリケーションの強みは、レイヤー間の分離レベルです。ここでは、一般的な規則としてすべてを停止し、上位層にとってより意味のあるエラーに情報を変換する一般的な例外でエラーを再スローします。
ルール: レイヤーへのすべてのエントリ ポイントは CATCH ALL で保護され、すべてのエラーは変換または処理されます。現在、この「処理済み」は 1% の確率でしか発生しません。ほとんどの場合、正しい抽象化でエラーを返す必要がある (または返すことができる) だけです。
いいえ、これを理解するのは非常に難しいと思います。実際の例 ->
いくつかのシミュレーションを実行するパッケージがあります。これらのシミュレーションはテキスト スクリプトです。これらのスクリプトをコンパイルするパッケージがあり、テキスト ファイルと、もちろんベース Java RTL を読み取るだけの汎用 utils パッケージがあります。UML 依存関係は->
Simulator->Compiler->utilsTextLoader->Java File
1) 1 つのプライベート内の utils ローダーで何かが壊れて、FileNotFound や Permissions などを取得した場合は、それを通過させます。他にできることは何もありません。
2) 境界では、最初に呼び出される utilsTextLoader 関数で、上記のルールと CATCH_ALL に従います。コンパイラは、ファイルがロードされたかどうかに関係なく、何が起こるかを気にしません。したがって、キャッチでは、新しい例外を再スローし、FileNotFound などを「ファイル XXXX を読み取れませんでした」に変換します。
3) コンパイラは、ソースがロードされていないことを認識します。それはそれが知る必要があるすべてです。したがって、後でネットワークからロードするように utilsTestLoader を変更しても、コンパイラは変更されません。FileNotFound を手放して後で変更すると、コンパイラに何の影響もありません。
4) サイクルが繰り返されます。ファイルの下位レイヤーを呼び出した実際の関数は、例外を取得しても何もしません。だからそれは上に行くことができます。
5) 例外がシミュレーターとコンパイラーの間のレイヤーに到達すると、コンパイラーは再び CATCHES_ALL を返し、詳細を非表示にして、より具体的なエラーをスローします:「スクリプト XXX をコンパイルできませんでした」
6) 最後に、このサイクルをもう一度繰り返します。コンパイラーを呼び出したシミュレーター関数は手放します。
7) 最終的な境界はユーザーにあります。ユーザーはLAYERであり、すべてが適用されます。メインには catches_ALL という try があり、最終的には適切なダイアログ ボックスまたはページを作成し、翻訳されたエラーをユーザーに "スロー" します。
だからユーザーは見ます。
シミュレータ: 致命的なエラーでシミュレータを起動できませんでした
-コンパイラ: スクリプト FOO1 をコンパイルできませんでした
--TextLoader: ファイル foo1.scp を読み取れませんでした
---trl: ファイルが見つかりません
比較:
a) コンパイラ: NullPointer Exception <-一般的なケースと、ファイル名のタイプミスをデバッグするための失われた夜
b) ローダー: ファイルが見つかりません <- ローダーが何百ものスクリプトをロードすることについて言及しましたか??
また
c) すべてが無視されたため、何も起こりません!!!
もちろん、これは、再スローのたびに原因例外を設定することを忘れていないことを前提としています。
さて、私の2cts。このシンプルなルールが私の命を何度も救ってくれました...
-エール