ch04 8章中 4章目

ch04 — 複数の catch ブロック

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch04 — 複数の catch ブロック」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch04 — 複数の catch ブロック」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch04 — 複数の catch ブロック」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

実際のアプリでは、「入力値が変」「ファイルが読めない」「DB が落ちている」といった 種類の違うエラー が同じ try ブロックの中で起こり得る。すべてを一律 catch (Exception $e) で受けると、画面に出すべきメッセージも対応方針も同じになってしまい、適切なリカバリができない。

PHP では catch ブロックを 複数並べる ことで、例外の 型ごとに分岐 できる。上から順にマッチ判定され、最初に該当した catch だけが実行される。InvalidArgumentException (引数の値が不正) なら入力フォームに戻す、RuntimeException (実行時の外部要因) なら再試行を促す、という分け方ができる。継承関係があるので、子クラスをより上の catch に書く順番が重要。

PHP 8 からは catch (TypeA | TypeB $e) と書いて、複数型を 1 つの catch で同時に受けることもできる。同じ処理で良いエラーを束ねたいときに使う。この章では、標準ライブラリに用意された InvalidArgumentException / RuntimeException を投げ分けて、catch でどう拾い分けるかをドリルで体感する。

学習目標

  • catch複数並べる ことで、例外の種類ごとに処理を分けられる
  • 上から順にマッチ判定され、最初に合った catch だけが実行される
  • InvalidArgumentException RuntimeException など標準例外の存在を知る

ドリル

no 内容
01 InvalidArgumentExceptionRuntimeException を別 catch で受ける

解説スライド 全 6 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. 複数の catch ブロック

    Lesson 10 / Chapter 4

  2. 例外には種類がある

    <?php
    throw new Exception(...);                  // 一般的な例外
    throw new InvalidArgumentException(...);   // 引数がおかしい
    throw new RuntimeException(...);           // 実行時の問題
    • PHP には 標準で複数の例外クラス が用意されている
    • 種類によって対応も変えたい
      • 引数エラー → ユーザーに「入力を直して」
      • 実行時エラー → ログを残して再試行
  3. catch を複数並べる

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

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

    実行結果:

    引数: 負の値
    • 上から順にチェック、最初に合った catch だけが走る
    • 残りは無視される
  5. 別の例外を投げると別の catch に行く

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

    実行結果:

    実行時: DB 接続失敗
    • 投げた例外の型に応じて、自動で正しい catch が選ばれる
  6. このチャプターでできるようになること

    catch を複数並べられる ✅ 例外の種類ごとに違う処理を書ける ✅ InvalidArgumentException RuntimeException を区別できる ✅ catch は上から順にマッチすると知っている

    → ドリルへ

1 / 6
📜 スライドを全部一気に読む(縦表示)

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 は上から順にマッチすると知っている

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — 2 種類の例外を別 catch で受ける README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

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

問題

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

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

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

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

期待される出力:

実行時: 実行時の問題

ヒント

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

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

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

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます