Laravel での 例外処理 Exception の拾い方
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