カスタム例外
テクノロジ系 / 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) { ... }