入力検証で例外を活用する
テクノロジ系 / 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 を使ってください。
tryでvalidateAge($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"; }