概要
実際のアプリでは、「入力値が変」「ファイルが読めない」「DB が落ちている」といった 種類の違うエラー が同じ try ブロックの中で起こり得る。すべてを一律 catch (Exception $e) で受けると、画面に出すべきメッセージも対応方針も同じになってしまい、適切なリカバリができない。
PHP では catch ブロックを 複数並べる ことで、例外の 型ごとに分岐 できる。上から順にマッチ判定され、最初に該当した catch だけが実行される。InvalidArgumentException (引数の値が不正) なら入力フォームに戻す、RuntimeException (実行時の外部要因) なら再試行を促す、という分け方ができる。継承関係があるので、子クラスをより上の catch に書く順番が重要。
PHP 8 からは catch (TypeA | TypeB $e) と書いて、複数型を 1 つの catch で同時に受けることもできる。同じ処理で良いエラーを束ねたいときに使う。この章では、標準ライブラリに用意された InvalidArgumentException / RuntimeException を投げ分けて、catch でどう拾い分けるかをドリルで体感する。
学習目標
catchを 複数並べる ことで、例外の種類ごとに処理を分けられる- 上から順にマッチ判定され、最初に合った catch だけが実行される
InvalidArgumentExceptionRuntimeExceptionなど標準例外の存在を知る
ドリル
| no | 内容 |
|---|---|
| 01 | InvalidArgumentException と RuntimeException を別 catch で受ける |
📝 演習: ドリル 01 — 2 種類の例外を別 catch で受ける
問題
try の中で次のように書いてください。
throw new RuntimeException("実行時の問題")を投げる
catch を 2 つ並べてください。
catch (InvalidArgumentException $e)で"引数: " . $e->getMessage()を出力catch (RuntimeException $e)で"実行時: " . $e->getMessage()を出力
期待される出力:
実行時: 実行時の問題ヒント
- catch を上から並べる順番は自由だが、投げる型に対応する catch だけが走る
RuntimeExceptionは PHP 標準の例外クラス