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
に変換され、呼び出し元に伝播されます。
再スローの利点は、呼び出し元が特定の例外に対してのみ処理を行うことができるようにすることです。これにより、呼び出し元がより具体的な例外に対処できるようになります。例外の種類や内容を変更せずに、例外の処理をより柔軟に制御することができます。