第1の例は、一般的に、より良いアプローチと考えられる。
またMyBusinessException
がラッピングNumberFormatException
であると考えてはならないのではなく、NumberFormatException
はMyBusinessException
の原因です。
インターフェイスが公開されている場合、例外が適切である必要があります。インターフェイスの呼び出し元は、実装の詳細を知っている必要はありません。 NumberFormatException
がexampleOneException
を呼び出すときにエラーのタイプとして真に意味を持たない限り、より適切な例外に変換する必要があります。
より具体的な例は、インターフェイスのユーザーが実装の詳細(コンパイル時でさえも知られていないかもしれない)に対処する必要がない、異なる実装を一般的に含む。
interface MyRepository {
Object read(int id) throws ObjectNotFoundException;
}
// a sql backed repository
class JdbcRepository implements MyRepository {
public Object read(int id) throws ObjectNotFoundException {
try { ... }
catch (SQLException ex) {
throw new ObjectNotFoundException(ex);
}
}
}
// a file backed repository
class FileRepository implements MyRepository {
public Object read(int id) throws ObjectNotFoundException {
try { ... }
catch (FileNotFoundException ex) {
throw new ObjectNotFoundException(ex)
}
}
}
インターフェイスが返すエラーの種類を宣言しているため、そのインターフェイスのクライアントは一貫性と合理性があります。 FileNotFoundException
とSQLException
を処理するコードを追加すると、実際の実装はどちらか一方でもどちらでもないことは素晴らしいことではありません。
FileRepository
の実装に複数の場所があり、FileNotFoundException
を投げる可能性がある場合を考えます。それは、それぞれのすべてが、オブジェクトが見つからないことを暗示していますか??
オプション2を考慮する場合は、catch
ブロックが発生したエラーの影響が軽減されていることを効果的に示していることを認識することが重要です。そこはチェック例外が合理的に無視され例がありますが、簡単な
try { ... }
catch (SomeException ex) {
log.error("caught some exception", ex);
}
が実際に例外の影響を考慮していない開発者の結果である、またはコードが含まれている必要があることをはるかに可能性がありますFIXME
。
これは、catch (Exception ex)
、または妥当性のないcatch (Throwable ex)
が表示されている場合にさらに当てはまります。
最後に、新しい実装を処理するために別のキャッチブロックを追加する必要があるすべての場所を見つけるアプリケーションを掘り下げたいと思うでしょうか?おそらくそれは...あなたが右方向に駆動されていないクリーンな固体コードの観点から抽象
'exampleOneException'を呼び出すメソッドは、' MyBusinessException'を捕捉し、それ自身の要件に従って処理できます。 'exampleTwoException'を呼び出すメソッドは何かが間違っていたことを知る方法がありません。 – khelwood
これらは根本的に異なることをしています。使用するアプローチは、エラーにどのように対応するかによって異なります。それらをローカルにロギングしたり、転送したり、エラーが発生したときの動作を変更する専用のビジネスロジックを使用することができます。 –
2つのコードスニペットは同じことをしていません。 1つは、もう一方の例外で例外を再投げているだけです。 –