採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

複数の catch ブロック

テクノロジ系 / exception (try / catch / throw / Exception / カスタム例外)

複数の catch ブロック

Lesson 10 / Chapter 4

例外には種類がある

<?php
throw new Exception(...);                  // 一般的な例外
throw new InvalidArgumentException(...);   // 引数がおかしい
throw new RuntimeException(...);           // 実行時の問題
  • PHP には 標準で複数の例外クラス が用意されている
  • 種類によって対応も変えたい

- 引数エラー → ユーザーに「入力を直して」

- 実行時エラー → ログを残して再試行

catch を複数並べる

<?php
try {
    // 失敗するかもしれない処理
} catch (InvalidArgumentException $e) {
    echo "引数エラー: " . $e->getMessage() . "\n";
} catch (RuntimeException $e) {
    echo "実行時エラー: " . $e->getMessage() . "\n";
}
  • catch をいくつでも並べられる
  • 投げられた例外の で振り分けられる

マッチは「上から順に」

<?php
try {
    throw new InvalidArgumentException("負の値");
} catch (InvalidArgumentException $e) {
    echo "引数: " . $e->getMessage() . "\n";   // ← ここに来る
} catch (RuntimeException $e) {
    echo "実行時: " . $e->getMessage() . "\n";
}

実行結果:

引数: 負の値
  • 上から順にチェック、最初に合った catch だけが走る
  • 残りは無視される

別の例外を投げると別の catch に行く

<?php
try {
    throw new RuntimeException("DB 接続失敗");
} catch (InvalidArgumentException $e) {
    echo "引数: " . $e->getMessage() . "\n";
} catch (RuntimeException $e) {
    echo "実行時: " . $e->getMessage() . "\n";   // ← ここに来る
}

実行結果:

実行時: DB 接続失敗
  • 投げた例外の型に応じて、自動で正しい catch が選ばれる

このチャプターでできるようになること

catch を複数並べられる

✅ 例外の種類ごとに違う処理を書ける

InvalidArgumentException RuntimeException を区別できる

✅ catch は上から順にマッチすると知っている

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — 2 種類の例外を別 catch で受ける

問題

try の中で次のように書いてください。

  • throw new RuntimeException("実行時の問題") を投げる

catch を 2 つ並べてください。

  • catch (InvalidArgumentException $e)"引数: " . $e->getMessage() を出力
  • catch (RuntimeException $e)"実行時: " . $e->getMessage() を出力

期待される出力:

実行時: 実行時の問題

採点

php scripts/grade.php topics/exception/ch04-multi-catch/drill/01-two-types/

ヒント

  • catch を上から並べる順番は自由だが、投げる型に対応する catch だけが走る
  • RuntimeException は PHP 標準の例外クラス