019 例外と例外処理(例外の伝播と再スロー) 017 解答例

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 メソッドでは、以下の手順に従って再スローが行われています:

  1. try ブロック内で何らかの操作が行われています。この操作で例外が発生する可能性があります。
  2. catch (Exception e) ブロック: 例外が発生した場合、このブロックが実行されます。Exception 型の変数 e で例外を捕捉します。
  3. String errorMessage = "performOperation メソッド内でエラーが発生しました";: エラーメッセージを生成します。このメッセージは CustomException のコンストラクタに渡されます。
  4. CustomException customException = new CustomException(errorMessage, e);: 新しい CustomException オブジェクトを生成します。エラーメッセージと元の例外 e がコンストラクタに渡されます。
  5. throw customException;: 生成した CustomException を再スローします。これにより、元の例外が CustomException に変換され、呼び出し元に伝播されます。

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

「019 例外と例外処理」問題集リスト