例外的なもの、あなたがあまりにも頻繁に遭遇することを合理的に期待できないもの、何かがうまくいかないことを示すものには例外を使用してください。たとえば、ネットワークがダウンしている場合、それはWebサーバーにとって例外的なものです。データベースが利用できない場合、何かが間違っていることを意味します。構成ファイルが欠落している場合、おそらくユーザーがそれを台無しにしたことを意味します。
不正なコードを処理するために例外を使用しないでください。コードの正確性を確認するには、アサーションを使用するか、.NET Framework 4以降では、コードコントラクト(アサーションを置き換え、追加の特に価値のある機能)を使用する必要があります。
例外的でない場合には例外を使用しないでください。ユーザーが数字の入力を求められたときに「犬」と入力したという事実は、例外に値するほど例外的ではありません。
例外のタイプを選択するときは注意してください。必要に応じて独自のタイプを作成します。親を捕まえると子供も捕まえることに留意して、継承を慎重に選択しました。決してthrow Exception
。
エラーに戻りコードを使用しないでください。エラーコードは簡単にマスクされ、無視され、忘れられます。エラーがある場合は、エラーを処理するか、上位スタックに伝播します。
メソッドがエラーを返すことが予想され、エラーが例外的でない場合は、エラー番号ではなく列挙型を使用してください。例:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
、などの意味はLoadOperationResult.ServerUnavailable
、LoadOperationResult.ParsingError
たとえば、コード12はサーバーがダウンし、コード13はデータを解析できないことを意味することを思い出すよりもはるかに明確です。
特定のドメインで働くすべての開発者が知っている一般的なコードを参照する場合は、エラーコードを使用します。たとえば、HTTP 404 Not FoundまたはHTTP 500 Internal Server Errorの列挙値を再作成しないでください。
ブール値に注意してください。遅かれ早かれ、特定のメソッドが成功したか失敗したかだけでなく、その理由を知りたくなるでしょう。そのためには、例外と列挙型がはるかに強力です。
すべての例外をキャッチしないでください(スタックの最上位にいる場合を除く)。例外をキャッチしたら、それを処理する準備ができているはずです。すべてをキャッチすることは、コードが正しく実行されるかどうか気にしないことを示しています。これにより、「今はこれを修正する方法を検索したくない」が解決するかもしれませんが、遅かれ早かれあなたを傷つけます。
C#では、次のような例外を再スローしないでください。
catch (SomeException ex)
{
...
throw ex;
}
スタックを壊しているからです。代わりにこれを行います:
catch (SomeException)
{
...
throw;
}
例外メッセージを書くときは努力してください。throw Exception("wrong data")
またはのようなものを見た回数throw Exception("shouldn't call this method in this context")
。6か月後の自分自身を含む他の開発者は、どのデータが間違っているのか、コンテキストでメソッドを呼び出すべきではない理由、または正確にどのコンテキストを呼び出すべきなのかを知りません。
ユーザーに例外メッセージを表示しません。それらは普通の人には期待されておらず、多くの場合、開発者自身にとっても読めません。
例外メッセージをローカライズしないでください。ローカライズされたメッセージのドキュメントを検索するのは大変で無意味です。すべてのメッセージは英語と英語のみである必要があります。
例外とエラーだけに集中しないでください。ログも非常に重要です。
.NETでは、メソッドのXMLドキュメントに例外を含めることを忘れないでください。
/// <exception cref="MyException">Description of the exception</exception>
XMLドキュメントに例外を含めると、ライブラリを使用している人にとって物事がずっと簡単になります。メソッドによってスローされる可能性のある例外とその理由を推測しようとする以上に迷惑なことはありません。
この意味で、Java例外処理は、より厳密で優れたアプローチを提供します。呼び出されたメソッドによってスローされる可能性のある例外を処理するか、処理しない例外をスローできることを独自のメソッドで宣言して、物事を特に透過的にします。