throw で例外を投げる
テクノロジ系 / exception (try / catch / throw / Exception / カスタム例外)
throw で例外を投げる
Lesson 10 / Chapter 2
「想定外の入力」を検知したい
<?php
function square(int $n): int {
if ($n < 0) {
// 負の数は想定外…どう伝える?
echo "エラー: 負の数\n";
return 0;
}
return $n * $n;
}echoだけだと、呼び出し元はエラーに気付けないreturn 0も「正常な 0」と区別がつかない- 「失敗した」と確実に伝える仕組みが欲しい
throw new Exception("...") で例外を投げる
<?php
function square(int $n): int {
if ($n < 0) {
throw new Exception("負の数は計算できません");
}
return $n * $n;
}throwで例外を 投げるnew Exception("メッセージ")で例外オブジェクトを作る- 投げた瞬間、その関数はそこで停止する
投げた例外は呼び出し元に伝わる
<?php
try {
echo square(-5) . "\n";
} catch (Exception $e) {
echo "失敗しました\n";
}実行結果:
失敗しました
square(-5)でthrow→ 関数を抜ける- 呼び出し元の
try / catchで受け止められる
正常時はそのまま動く
<?php
try {
echo square(4) . "\n"; // 16
} catch (Exception $e) {
echo "失敗\n";
}実行結果:
16
- 例外を投げなければ
catchブロックには来ない - 「異常時だけ throw、正常時は普通に return」が基本パターン
このチャプターでできるようになること
✅ throw new Exception("...") で例外を投げられる
✅ 投げると関数はその場で停止する
✅ 呼び出し元の try / catch で受け止められる
✅ 「異常 → throw、正常 → return」を書き分けられる
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 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: 負の数です
採点
php scripts/grade.php topics/exception/ch02-throw/drill/01-throw-on-negative/
ヒント
$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"; }