アプリケーションで例外を処理する方法を決定するのに行き詰まっています。
例外に関する私の問題が1)リモートサービスを介したデータへのアクセス、または2)JSONオブジェクトの逆シリアル化に起因する場合の多くは、残念ながら、私はこれらのタスク(ネットワーク接続の切断、制御不能な不正なJSONオブジェクト)の成功を保証できません。
その結果、例外が発生した場合は、関数内で例外をキャッチし、呼び出し元にFALSEを返します。私の論理では、呼び出し元が本当に気にするのは、タスクが成功したかどうかではなく、タスクが成功しなかった理由だけです。
典型的なメソッドのサンプルコード(JAVA形式)を以下に示します)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
このアプローチは問題ないと思いますが、例外を管理するためのベストプラクティスを知りたいと思います(本当にコールスタックまで例外をバブルする必要がありますか?)。
重要な質問の要約:
- 例外をキャッチするだけで問題はありませんが、それらをバブルアップしたり、システムに正式に通知したりしないでください(ログまたはユーザーへの通知を介して)?
- すべてがtry / catchブロックを必要としない例外のベストプラクティスは何ですか?
フォローアップ/編集
すべてのフィードバックに感謝し、例外管理に関する優れた情報源をオンラインで見つけました:
- 例外処理のベストプラクティス| オライリーメディア
- .NETの例外処理のベストプラクティス
- ベストプラクティス:例外管理(記事は現在、archive.orgのコピーを指しています)
- 例外処理アンチパターン
例外管理は、コンテキストによって異なるものの1つであるようです。しかし、最も重要なのは、システム内の例外を管理する方法に一貫性が必要です。
さらに、過度の試行/キャッチによるコードの腐敗に注意するか、例外を尊重しないようにしてください(例外はシステムに警告していますが、他に何を警告する必要がありますか?)。
Anders Hejlsbergとあなたの意見に同意する傾向があります。ほとんどの発信者は、操作が成功したかどうかだけを気にします。
このコメントから、例外を処理する際に考慮すべきいくつかの質問が表示されます。
- この例外がスローされる点は何ですか?
- それを処理することはどのように意味がありますか?
- 呼び出し元は本当に例外を気にしますか、それとも呼び出しが成功したかどうかだけ気にしますか?
- 発信者に潜在的な例外の管理を優雅に強制していますか?
- 言語の偶像に敬意を払っていますか?
- 本当にブールのような成功フラグを返す必要がありますか?boolean(またはint)を返すことは、Java(Javaでは例外を処理するだけ)よりもCの考え方に近いものです。
- 言語に関連付けられているエラー管理構造に従ってください:)!