概要
ch01 では try / catch で「飛んできた例外を受け止める」側を扱った。この章では反対側、つまり「自分から例外を投げる」側を学ぶ。書き方は throw new Exception("メッセージ") の 1 行で、これを実行した瞬間にその関数の処理は中断され、呼び出し元の catch まで一気に巻き戻る。
例外の最大の効用は、関数の戻り値を「正常な結果のみ」に絞れる ことだ。たとえば年齢を返す関数が -1 を「エラー」のサインとして返していると、呼び出し側は毎回 -1 チェックを挟むことになる。代わりに「不正なら throw、正常なら数値を return」と決めておけば、戻り値は常に意味のある年齢になり、エラー処理は catch 側に分離できる。
どこで投げ、どこで捕まえるかは設計判断。一般的には 「異常を最初に検知した場所で throw」「対応できるレイヤーで catch」 が定石。たとえば DB アクセス層が SQL エラーを throw し、画面表示層が catch してユーザー向けメッセージに変換する、という形だ。この章のドリルでは「負の数なら throw」という最小例で、投げる側のコードに慣れる。
学習目標
throw new Exception("...")で自分から例外を発生させられる- 「想定外の入力」を検知したら、エラーを呼び出し元に伝えられる
- 単に
echo "エラー"するのと違って、処理の流れを 強制的に中断 できる
ドリル
| no | 内容 |
|---|---|
| 01 | 入力が負なら throw、正なら普通に出力する |
📝 演習: ドリル 01 — 負の数で throw
問題
標準入力から整数を 1 行読み込みます。
n < 0ならthrow new Exception("負の数です")を投げる- それ以外なら
"OK: n = {n}"を 1 行出力する
try / catch で受け止め、catch ブロックでは "NG: 負の数です" を 1 行出力してください。
入力例 (tests/input.txt)
-3期待される出力 (tests/expected.txt)
NG: 負の数ですヒント
$n = (int) trim(fgets(STDIN));try { if ($n < 0) throw new Exception("負の数です"); else echo "OK: n = $n\n"; }catch (Exception $e) { echo "NG: " . $e->getMessage() . "\n"; }