複数の 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 標準の例外クラス