public class RethrowExample {
public static void main(String[] args) {
try {
performOperation();
} catch (CustomException e) {
System.out.println("メインメソッド: " + e.getMessage());
}
}
static void performOperation() throws CustomException {
try {
// 何らかの操作を試みる
} catch (Exception e) {
// CustomExceptionに変換して再スローするコードを追加
// エラーメッセージの生成
String errorMessage = "performOperation メソッド内でエラーが発生しました";
// CustomExceptionオブジェクトの作成
CustomException customException = new CustomException(errorMessage, e);
// 新しく生成した CustomException を再スロー
throw customException;
}
}
}
class CustomException extends Exception {
// カスタム例外クラスの宣言
// コンストラクタにエラーメッセージと元の例外を渡す
public CustomException(String message, Throwable cause) {
super(message, cause);
}
}このプログラムは、performOperation メソッド内で例外が発生した場合に、それを CustomException に変換して再スローする例を示しています。これは「例外の再スロー」の一例です。
catch (Exception e)ブロック: このブロックでは、何らかの操作を試みる中で例外が発生した場合に実行されます。この例外はException型の変数eに捕捉されます。String errorMessage = "performOperation メソッド内でエラーが発生しました";: エラーメッセージの生成です。このメッセージはCustomExceptionのコンストラクタに渡されます。CustomException customException = new CustomException(errorMessage, e);: 新しいCustomExceptionオブジェクトを生成します。この際、先ほど生成したエラーメッセージと元の例外eをコンストラクタに渡します。throw customException;: 生成したCustomExceptionを再スローします。これにより、元の例外がCustomExceptionに変換され、CustomExceptionが呼び出し元に伝播されます。
このようにすることで、performOperation メソッドを呼び出す側で CustomException を捕捉することができます。
再スロー
「再スロー」(rethrow)は、例外をキャッチしてそれを直接処理せず、再びスローすることを指します。これは通常、例外の種類を変更したり、例外の情報を追加したりする場合に使用されます。以下に、提供されたプログラムの「再スロー」についての解説を示します。
static void performOperation() throws CustomException {
try {
// 何らかの操作を試みる
} catch (Exception e) {
// CustomExceptionに変換して再スローするコードを追加
// エラーメッセージの生成
String errorMessage = "performOperation メソッド内でエラーが発生しました";
// CustomExceptionオブジェクトの作成
CustomException customException = new CustomException(errorMessage, e);
// 新しく生成した CustomException を再スロー
throw customException;
}
}この performOperation メソッドでは、以下の手順に従って再スローが行われています:
tryブロック内で何らかの操作が行われています。この操作で例外が発生する可能性があります。catch (Exception e)ブロック: 例外が発生した場合、このブロックが実行されます。Exception型の変数eで例外を捕捉します。String errorMessage = "performOperation メソッド内でエラーが発生しました";: エラーメッセージを生成します。このメッセージはCustomExceptionのコンストラクタに渡されます。CustomException customException = new CustomException(errorMessage, e);: 新しいCustomExceptionオブジェクトを生成します。エラーメッセージと元の例外eがコンストラクタに渡されます。throw customException;: 生成したCustomExceptionを再スローします。これにより、元の例外がCustomExceptionに変換され、呼び出し元に伝播されます。
再スローの利点は、呼び出し元が特定の例外に対してのみ処理を行うことができるようにすることです。これにより、呼び出し元がより具体的な例外に対処できるようになります。例外の種類や内容を変更せずに、例外の処理をより柔軟に制御することができます。


