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

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"; }