概要

DB 層が PDOException("SQLSTATE[23000]...") のような低レベルな例外を投げてきたとき、それを そのまま画面層まで届ける のは設計として弱い。画面層は SQL のことを知らないし、知るべきでもない。レイヤーをまたぐ境界では、そのレイヤーの言葉に翻訳された例外 に変換した方が、上層は扱いやすい。

PHP の catch ブロックの中で throw new XxxError(...) と書けば、受け取った例外を踏み台にして 別の例外に包んで投げ直す ことができる。これを rethrow (再 throw) と呼ぶ。たとえば DB 層で PDOException を catch して、ドメイン層では UserRegistrationFailedError として上に伝える。catch 側 (画面層) はこの上位の型だけ知っていればよくなる。

このとき大事なのが previous 引数new XxxError("失敗", 0, $e) のように元の例外を 3 番目に渡しておくと、$e->getPrevious() で元の例外を辿れる。ログには元の SQL エラーまで残せて、画面にはドメイン側のメッセージを出す、という両立ができる。レイヤー境界での「翻訳しつつ証拠も残す」定石パターン。

学習目標

ドリル

このチャプターはスライドのみ。次の章へ。

採点ドリルは無し。スライドで概念を理解したら ch08 (validation-pattern) に進む。

この章を AI に聞く

  1. 「ch07 — 例外の再 throw (rethrow)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

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

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch07 — 例外の再 throw (rethrow)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch07 — 例外の再 throw (rethrow)」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE