答えは非常に簡単です。
内部例外を処理できる場合は、それをキャッチして合理的なことを行う必要があります
対処できない場合は、次の 2 つの選択肢があります。
- 例外が実装固有の場合は、それをキャッチして、呼び出し元に受け入れられる例外をスローします (通常は実際の例外をラップします)。
- 例外が呼び出し元のドメインにある場合は、それをスローすると宣言し、呼び出し元に処理させます
各タイプの例を次に示します。
例 1: 対処:
public void deleteFile(String filename) {
File file = new File(filename);
try {
file.delete();
} catch (FileNotFoundException e) {
// No big deal - it was already deleted
}
}
例 2: ラッピング:
public void changePassword(String username, String password) throws UserUpdateException {
try {
// execute SQL to update the password
// but storing the user in a DB is an imlementation choice
// we could use a file on disk or a remote web service to store user info
} catch (SQLException e) {
throw new UserUpdateException(e);
}
}
例 3: 何もしない:
public void insertIntoDatabase(Record record) throws SQLException {
// execute SQL on the database
// using a DB is implied - let the exception bubble up
}