ch08 8章中 8章目

ch08 — 入力検証で例外を活用する

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch08 — 入力検証で例外を活用する」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch08 — 入力検証で例外を活用する」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch08 — 入力検証で例外を活用する」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

トピックの締めとして、例外を 入力検証 (バリデーション) に応用する実用パターンを扱う。フォーム入力・API パラメータ・関数引数――どんな入り口でも、「想定外の値はその場で弾く」ことで、後段のロジックを「もう変な値は来ない」前提で書ける。

具体的な書き方は ガード節 (guard clause) と呼ばれるスタイル。関数の冒頭で if ($age < 0 || $age > 150) { throw new InvalidArgumentException(...); } のように、不正値を 早期 throw で振り落とす。残りの処理は正常値だけが流れてくる前提になるので、ネストが減り、本来のロジックが読みやすくなる。

PHP では値の不正には InvalidArgumentException を投げる慣習がある (標準ライブラリも同様)。大きなアプリでは Symfony Validator / Laravel Validator などへ発展する。この章は「年齢 0-150」という最小例で、ガード節と例外の組み合わせを身体に通す。

学習目標

  • 入力値のチェックで例外を投げる「検証パターン」を書ける
  • 範囲外なら InvalidArgumentException を投げる慣習を知っている
  • 呼び出し元は try / catch だけで OK / NG の分岐ができる

ドリル

no 内容
01 年齢が 0-150 の範囲外なら例外を投げる

解説スライド 全 6 枚

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

  1. 入力検証で例外を活用する

    Lesson 10 / Chapter 8

  2. 「ありえない値」が来たらどうする?

    <?php
    function registerAge(int $age) {
        if ($age < 0 || $age > 150) {
            // どうやって呼び出し元に伝える?
            return false;
        }
        // 登録処理
        return true;
    }
    • return false だと「失敗した理由」が伝わらない
    • if/else の戻り値チェックが連鎖して読みにくい
  3. 例外で「ありえない入力」を表現する

    <?php
    function registerAge(int $age) {
        if ($age < 0 || $age > 150) {
            throw new InvalidArgumentException(
                "age は 0-150 の範囲: $age"
            );
        }
        // 登録処理
        echo "登録: age = $age\n";
    }
    • InvalidArgumentException は「引数が不正」を表す標準例外
    • メッセージに値を含めると、原因がすぐ分かる
  4. 呼び出し側は try / catch でまとめて受ける

    <?php
    try {
        registerAge($age);
        echo "OK\n";
    } catch (InvalidArgumentException $e) {
        echo "NG: " . $e->getMessage() . "\n";
    }
    • 1 つの catch で全部の検証エラーを拾える
    • 「正常ルート」と「失敗ルート」が綺麗に分かれる
  5. ガード節パターン

    <?php
    function registerAge(int $age) {
        if ($age < 0)   throw new InvalidArgumentException("負の値");
        if ($age > 150) throw new InvalidArgumentException("大きすぎる");
        if (!is_int($age)) throw new InvalidArgumentException("整数でない");
    
        // ここまで来たら全部 OK
        // 本来の処理を書く
    }
    • 「ありえない条件」を最初にチェックして throw
    • 関数の本体は 正常ケースだけ を書けばよい
    • ネストが浅くなり、読みやすくなる
  6. このチャプターでできるようになること

    ✅ 入力検証で例外を投げる典型パターンを書ける ✅ InvalidArgumentException の慣習を知っている ✅ ガード節で読みやすくできる ✅ try / catch 1 つで OK / NG を分岐できる

    → ドリルへ

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

Lesson 10 / Chapter 8


「ありえない値」が来たらどうする?

<?php
function registerAge(int $age) {
    if ($age < 0 || $age > 150) {
        // どうやって呼び出し元に伝える?
        return false;
    }
    // 登録処理
    return true;
}
  • return false だと「失敗した理由」が伝わらない
  • if/else の戻り値チェックが連鎖して読みにくい

例外で「ありえない入力」を表現する

<?php
function registerAge(int $age) {
    if ($age < 0 || $age > 150) {
        throw new InvalidArgumentException(
            "age は 0-150 の範囲: $age"
        );
    }
    // 登録処理
    echo "登録: age = $age\n";
}
  • InvalidArgumentException は「引数が不正」を表す標準例外
  • メッセージに値を含めると、原因がすぐ分かる

呼び出し側は try / catch でまとめて受ける

<?php
try {
    registerAge($age);
    echo "OK\n";
} catch (InvalidArgumentException $e) {
    echo "NG: " . $e->getMessage() . "\n";
}
  • 1 つの catch で全部の検証エラーを拾える
  • 「正常ルート」と「失敗ルート」が綺麗に分かれる

ガード節パターン

<?php
function registerAge(int $age) {
    if ($age < 0)   throw new InvalidArgumentException("負の値");
    if ($age > 150) throw new InvalidArgumentException("大きすぎる");
    if (!is_int($age)) throw new InvalidArgumentException("整数でない");

    // ここまで来たら全部 OK
    // 本来の処理を書く
}
  • 「ありえない条件」を最初にチェックして throw
  • 関数の本体は 正常ケースだけ を書けばよい
  • ネストが浅くなり、読みやすくなる

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

✅ 入力検証で例外を投げる典型パターンを書ける ✅ InvalidArgumentException の慣習を知っている ✅ ガード節で読みやすくできる ✅ try / catch 1 つで OK / NG を分岐できる

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — 年齢を検証して例外で弾く README.md starter.php answer.php

演習問題の詳細

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

ドリル 01 — 年齢を検証して例外で弾く

問題

標準入力から整数 $age を 1 行読み込みます。

validateAge(int $age) という関数を定義してください。

  • $age < 0 または $age > 150 の場合、 throw new InvalidArgumentException("age must be 0-150: $age")
  • それ以外は何もしない

main 部分では try / catch を使ってください。

  • tryvalidateAge($age); を呼び、続けて "OK: $age" を出力
  • catch (InvalidArgumentException $e)"NG: " . $e->getMessage() を出力

入力例 (tests/input.txt)

200

期待される出力 (tests/expected.txt)

NG: age must be 0-150: 200

ヒント

  • function validateAge(int $age) { if ... throw new InvalidArgumentException(...); }
  • try { validateAge($age); echo "OK: $age\n"; }
  • catch (InvalidArgumentException $e) { echo "NG: " . $e->getMessage() . "\n"; }

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

演習問題(1問)

  1. ドリル 01 — 年齢を検証して例外で弾く

    README.md starter.php answer.php

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

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