概要
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 エラーまで残せて、画面にはドメイン側のメッセージを出す、という両立ができる。レイヤー境界での「翻訳しつつ証拠も残す」定石パターン。
学習目標
- catch で受けた例外を 別の例外に包んで再 throw できる
- 低レベルの例外を上位の意味あるエラーに変換する書き方を理解する
previousチェーンで元の例外も残せると知っている
ドリル
このチャプターはスライドのみ。次の章へ。
採点ドリルは無し。スライドで概念を理解したら ch08 (validation-pattern) に進む。