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

カスタム例外

テクノロジ系 / exception (try / catch / throw / Exception / カスタム例外)

カスタム例外

Lesson 10 / Chapter 6

標準の Exception だけだと区別がつかない

<?php
try {
    if (在庫不足) throw new Exception("在庫不足");
    if (支払い失敗) throw new Exception("支払い失敗");
} catch (Exception $e) {
    // どっちの例外?
    // メッセージで判定するしかない…
}
  • 全部 Exception だと、どの種類かを 文字列で判定 することになる
  • 文字列マッチは壊れやすい

extends Exception で自分の例外クラスを作る

<?php
class StockError extends Exception {}
class PaymentError extends Exception {}
  • ボディは空 ({}) でも OK
  • Exception を継承するので、getMessage() などの機能はそのまま使える
  • これだけで 新しい型 が手に入る

投げる: throw new MyError(...)

<?php
function decrementStock(int $qty) {
    if ($qty <= 0) {
        throw new StockError("在庫がありません");
    }
}
  • throw new StockError("...") で自作例外を投げる
  • 使い方は標準 Exception と同じ

受ける: 型で振り分け

<?php
try {
    decrementStock(0);
} catch (StockError $e) {
    echo "在庫エラー: " . $e->getMessage() . "\n";
} catch (PaymentError $e) {
    echo "支払いエラー: " . $e->getMessage() . "\n";
}

実行結果:

在庫エラー: 在庫がありません
  • 型で区別できるので、メッセージマッチ不要
  • ドメイン固有のエラーを クラス階層 で表現できる

このチャプターでできるようになること

class MyError extends Exception {} で自作できる

throw new MyError(...) で投げられる

✅ 自作の型で catch できる

✅ ドメイン固有エラーを型で区別できる

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — カスタム例外を作って投げて受ける

問題

Exception を継承した MyError クラスを定義してください (中身は空でよい)。

try の中で throw new MyError("自作エラー") を投げ、

catch (MyError $e) の中で "caught: " . $e->getMessage() を 1 行出力してください。

期待される出力:

caught: 自作エラー

採点

php scripts/grade.php topics/exception/ch06-custom-exception/drill/01-custom-exc/

ヒント

  • class MyError extends Exception {}
  • throw new MyError("自作エラー");
  • catch (MyError $e) { ... }