Laravelの例外処理で最低限知っておきたいこと
例外をレンダリング・出力する機能と、ロギングする機能の2つに分かれる
デフォルトの例外処理クラスApp\Exceptions\Handler
が継承する親クラスIlluminate\Foundation\Exceptions\Handler
には、render()
, report()
というメソッドがあり、これらがそれぞれレンダリング・出力と、ロギングを受け持つ。
またこれらのメソッドは、Illuminate\Foundation\Bootstrap\HandleExceptions::bootstrap()
でset_exception_handler()
で設定された、同クラスのhandleException()
メソッドから呼ばれる。
app.debugが真の場合、デバッグ情報つきでレンダリングされる
最近のLaravelならデフォルトであればIgnitionが使われる。Ignitionがなければ、以前のLaravelで使われていたWhoopsが使われる。
render()
内にはいろいろな処理があるが、基本はprepareResponse()
の呼び出しだ。
app.debug
だけ見ていて、app.env
は見ないので、.env
にAPP_ENV=production
としても、APP_DEBUG=true
のままであればデバッグ情報が出力されてしまうことに注意。
その他レンダリング・出力を調整したい場合は、render()
を読めばどうすればいいかわかるだろう。
例外クラスにrender()
メソッドを実装しておけば、ハンドラのrender()
をオーバーライドしたりしなくても好き勝手に表示変えられるのも、ちゃんと読めばわかる(私はちゃんと読まず、オーバーライドしてしまった)。
一部の例外はロギングされない
Illuminate\Foundation\Bootstrap\HandleExceptions::$internalDontReport
に設定さ
れたクラスや、App\Exceptions\Handler::$dontReport
に設定した例外クラスはロギン
グされない。
これにはIlluminate\Http\Exceptions\HttpResponseException
やIlluminate\
Validation\ValidationException
等が含まれ、abort()
やバリデーションエラーがログ
に残らないのは、このせいである。