👻

Laravel での 例外処理 Exception の拾い方

2022/10/21に公開

altテキスト

Laravelの例外処理, ExceptionHandler

Laravel にて try-catch 構文を使用した際に、
○○Exception 前に バックスラッシュをつけた時とつけない時の
挙動が気になったので調査してみました。

使用環境:

Amazon Linux 2
Composer version 2.3.9
Laravel Framework 9.19.0
PHP 8.0.18

バックスラッシュなしの場合

  • QueryException

検証①
Laravel固有のQueryExceptionをバックスラッシュなしでスローしてみます。
QueryExceptionはPHPのPDOExceptionを継承しています。

try {
    \DB::statement('INSERT INTO invalid_grammar(?, ?, ?)', [1, null,'xxx']);
} catch (QueryException $e) {
    dd("catch QueryException");
}

結果① : QueryException では catch されませんでした。


  • QueryException & Exception

検証②
バックスラッシュなしのException

try {
    \DB::statement('INSERT INTO invalid_grammar(?, ?, ?)', [1, null,'xxx']);
} catch (QueryException $e) {
    dd("catch QueryException");
} catch (Exception $e) {
    dd("catch Exception");
}

結果② : Exception でも拾えませんでした。 バックスラッシュなしだと拾わないみたいです...


バックスラッシュありの場合

  • \Exception

検証③
バックスラッシュありのException

try {
    \DB::statement('INSERT INTO invalid_grammar(?, ?, ?)', [1, null,'xxx']);
} catch (QueryException $e) {
    dd("catch QueryException");
} catch (\Exception $e) {
    dd("catch \Exception");
}

結果③ : バックスラッシュありだと拾います。

※PDOExceptionは、接続に失敗した場合などに投げられる例外です。
※QueryExceptionは、PDOExceptionを継承したクラスでクエリの例外です。




バックスラッシュはLaravelではどのような意味をもつのか

バックスラッシュ / をつけることで、Laravelは、グローバル空間のクラスを参照します。
namespace(名前空間)の中でクラスを宣言し、バックスラッシュをつけないと
ローカル空間のクラスを参照しにいくことになります。
※通常Laravelでは、App\Exception\Handlerが例外処理を行います。

namespaceを設定しておくと、ファイルを自動でインクルードしてくれますが
同時にuse, \ などで明示的にクラスのエイリアスを指定しないと
想定とは違う挙動になります。

複数人で開発する際は、バックスラッシュはつけるなどルールをあらかじめ決めて
開発するのが望ましいと言えるでしょう。

Discussion