基本的に 2 つの適切な選択肢があります。
選択肢 1:
例外を適切に処理できる場合は、次のようにします。
try {
String res = conn.getData(command);
} catch (IOException e) {
// do something sensible, perhaps return null or a default value etc
}
これは、例外を処理するために呼び出し元に負担をかけないため、理にかなっている場合、通常は適切なオプションです。
選択肢 2:
例外を合理的に処理できない場合は、メソッドに例外をスローさせます。ここでの設計上の問題は、どの例外をスローするかです。
例外がコードの残りの部分に「うまく適合する」場合は、メソッドを宣言して、サードパーティのライブラリから期待される例外をスローするだけです。
public void processData(Connection conn, String command) throws IOException
ただし、多くの場合、サード パーティのライブラリを呼び出すと、スローされる例外がアプリケーションと互換性がありません。あなたの場合、IOException
アプリケーションのドメインの完全に外側にある可能性があり、サードパーティの実装がリモートサーバーにアクセスするためにのみスローされ(たとえば)、スローIOException
すると、コードに「うまく適合しない」新しい例外が導入されますその目的 (例えば、あなたのアプリケーションはリモートサーバーの使用とは何の関係もないかもしれません)。
このような場合、例外をドメイン例外でラップし、代わりにそれをスローするのが最善です。例えば:
public void processData(Connection conn, String command) throws ProcessingException
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new ProcessingException(e);
}
}
これを実現するには、次のような Exception クラスを作成します。
public class ProcessingException extends Exception {}
これで、さらに選択肢ができました。例外が発生することが予想されない場合、つまり、発生しないことを確認するための適切な措置を講じている場合 (環境が正しいことを確認するなど)、チェックされていない例外をスローするオプションがあります。
public void processData(Connection conn, String command)
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
このバージョンは基本的に、例外は予期されていないことを示しており、状況はどのレベルでも回復できないため、コードを作成するつもりはありません。キャッチException
。
これは「アンチパターン」ではありません。なぜならNullPointerException
、他のすべての一般的なチェックされていない例外と並んでおり、それらもキャッチしないからです。