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は見ないので、.envAPP_ENV=productionとしても、APP_DEBUG=trueのままであればデバッグ情報が出力されてしまうことに注意。

その他レンダリング・出力を調整したい場合は、render()を読めばどうすればいいかわかるだろう。

例外クラスにrender()メソッドを実装しておけば、ハンドラのrender()をオーバーライドしたりしなくても好き勝手に表示変えられるのも、ちゃんと読めばわかる(私はちゃんと読まず、オーバーライドしてしまった)。

一部の例外はロギングされない

Illuminate\Foundation\Bootstrap\HandleExceptions::$internalDontReportに設定さ れたクラスや、App\Exceptions\Handler::$dontReportに設定した例外クラスはロギン グされない。

これにはIlluminate\Http\Exceptions\HttpResponseExceptionIlluminate\ Validation\ValidationException等が含まれ、abort()やバリデーションエラーがログ に残らないのは、このせいである。