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

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

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

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

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 を分岐できる

→ ドリルへ

考えてみよう

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

ドリル 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

採点

php scripts/grade.php topics/exception/ch08-validation-pattern/drill/01-validate/

ヒント

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