例外修羅道 Step04:Exceptionでまとめてcatchせよ

0004_例外修羅道-step04 learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(Step04)


問題のポイント

  • ArrayIndexOutOfBoundsExceptionArithmeticException も、すべては Exception の子どもたち。
  • 例外の親クラスで catch すれば、どんな例外もまとめて捕まえられる。
  • 分けるのが正義とは限らん。まとめるときの文脈とメリットを掴め。

まず、日本語で考えろ

また配列アクセス → 割り算。
でも今回は、「何が起きたかは詳しく気にせず、とにかく止めずに処理したい」ケースや。
ならば、例外の型ごとに分けるより、“全部ひとくくり”にしたほうが効率的なこともある。


コメントを書け

// 配列のインデックスと除算処理を行う
// 例外が起きたら Exception ですべてまとめてcatchする
// getMessage() で例外の原因を出力する

コメントに従ってコードを書け

public class ExceptionUtil {

    public static void safeProcess(int[] array, int index, int divisor) {
        try {
            int value = array[index];
            System.out.println("選ばれた値: " + value);

            int result = value / divisor;
            System.out.println("計算結果: " + result);

        } catch (Exception e) {
            System.out.println("例外が発生しました: " + e.getMessage());
        }
    }
}

実行結果の例

safeProcess({10, 20, 30}, 1, 5); → 選ばれた値: 20 / 計算結果: 4  
safeProcess({10, 20, 30}, 3, 2); → 例外が発生しました: Index 3 out of bounds for length 3  
safeProcess({10, 20, 30}, 0, 0); → 選ばれた値: 10 / 例外が発生しました: / by zero

コードの解説

  • catch (Exception e) にすることで、種類を問わずすべての例外を一括で処理できる
  • e.getMessage() を使えば、例外の発生原因を一行で確認できる
  • このスタイルは「とにかく止まるな」「ログだけ残せ」って場面で有効
  • ただし、何の例外かが判別しづらくなるというデメリットもある

つまづきやすいポイント

  • Exception でcatchしてると、具体的な対応(復旧・分岐)はできない
  • getMessage() は簡潔だが、全体のスタックトレースは表示されない
  • 複数の例外のどれが起きたかに応じた処理が必要な場合は、やっぱり個別にcatchすべき(Step03参照)

// tesh:
// まとめて catch する。それは甘えじゃない。
// 状況に応じて“分けるか、まとめるか”を選ぶ判断力。それが問われてる。
//  
// すべてを一括で握りつぶす、という戦略もある。
// でもそれは、「何もわからないから」じゃなく「構造を知って選んだ」から許されるやり方や。
// 
// Just keep typing, baby.
// catch は構文。選び方は、戦略や。

例外修羅道:全体のステップ構成はこちら