ch02 8章中 2章目

ch02 — throw で例外を投げる

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch02 — throw で例外を投げる」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch02 — throw で例外を投げる」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch02 — throw で例外を投げる」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

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、正なら普通に出力する

解説スライド 全 6 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. throw で例外を投げる

    Lesson 10 / Chapter 2

  2. 「想定外の入力」を検知したい

    <?php
    function square(int $n): int {
        if ($n < 0) {
            // 負の数は想定外…どう伝える?
            echo "エラー: 負の数\n";
            return 0;
        }
        return $n * $n;
    }
    • echo だけだと、呼び出し元はエラーに気付けない
    • return 0 も「正常な 0」と区別がつかない
    • 「失敗した」と確実に伝える仕組みが欲しい
  3. throw new Exception("...") で例外を投げる

    <?php
    function square(int $n): int {
        if ($n < 0) {
            throw new Exception("負の数は計算できません");
        }
        return $n * $n;
    }
    • throw で例外を 投げる
    • new Exception("メッセージ") で例外オブジェクトを作る
    • 投げた瞬間、その関数はそこで停止する
  4. 投げた例外は呼び出し元に伝わる

    <?php
    try {
        echo square(-5) . "\n";
    } catch (Exception $e) {
        echo "失敗しました\n";
    }

    実行結果:

    失敗しました
    • square(-5)throw → 関数を抜ける
    • 呼び出し元の try / catch で受け止められる
  5. 正常時はそのまま動く

    <?php
    try {
        echo square(4) . "\n";   // 16
    } catch (Exception $e) {
        echo "失敗\n";
    }

    実行結果:

    16
    • 例外を投げなければ catch ブロックには来ない
    • 「異常時だけ throw、正常時は普通に return」が基本パターン
  6. このチャプターでできるようになること

    throw new Exception("...") で例外を投げられる ✅ 投げると関数はその場で停止する ✅ 呼び出し元の try / catch で受け止められる ✅ 「異常 → throw、正常 → return」を書き分けられる

    → ドリルへ

1 / 6
📜 スライドを全部一気に読む(縦表示)

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」を書き分けられる

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — 負の数で throw README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 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"; }

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

  1. ドリル 01 — 負の数で throw

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます