例外、ログ

Tag:

例外の処理方法、Logファサードのメソッドについて取り上げます。

例外

Laravelでは、「App\Exceptions\Handlerクラス」によって、トップレベルの例外メカニズムを実現しています。つまり、アプリケーション内でハンドリングされなかった例外は、「App\Exceptions\Handlerクラス」がハンドリングしてくれます。

エラー発生時、デバックモード(.envのAPP_DEBUGがtrueである)であれば、デバック情報を詳細に出力してくれます。

reportメソッド

例外をログする。

renderメソッド

例外をHTTPレスポンスへ変換する。
例外インスタンスが、HttpExceptionクラスのインスタンスであれば、エラーページを表示。

※エラーページ
「resources/views/errors/STATUS_CODE.blade.php」が使われる。
例えば、404エラーの場合、「resources/views/errors/404.blade.php」が出力される。

対応するビューテンプレートがない場合、専用のエラーレスポンスが出力される。

カスタマイズ

デフォルトのまま利用したとき、下記2点の動作が気になります。

・ステータスコードごとにエラーページを用意しないといけない。
・メソッドが存在しない、変数が未定義などのバグが存在するとき、「Whoops, looks like something went wrong.」と表示される。

対策として、「app\Exceptions\Handler.php」を以下のようにカスタマイズしました。

public function render($request, Exception $e)
{
    if (config('app.debug') || $e instanceof ValidationException) {
        return parent::render($request, $e);
    }

    if ($this->isHttpException($e)) {
        return $this->renderHttpException($e);
    } else {
        \Log::error($e->getTraceAsString());
        return $this->renderHttpException(new HttpException(500, $e->getMessage(), $e));
    }
}

protected function renderHttpException(HttpException $e)
{
    $status = $e->getStatusCode();
    return response()->view("errors.common", ['exception' => $e], $status);
}
3~5行目
デバックモードのときは、デバッグ情報を確認したいのでデフォルトの動作をするようにしています。
ValidationExceptionのときも、リダイレクトさせたり、jsonデータをレスポンスとして返す必要があるので、デフォルトの動作をするようにしています。
9~12行目
HttpExceptionのインスタンス以外のときもエラーページを表示するようにしています。
15~19行目
renderHttpExceptionをオーバーライドして、エラーページを全て「errors.common」で処理するようにしています。

※参考URL
https://readouble.com/laravel/5.2/ja/errors.html
Laravel5: エラーページを共通化〜どんなステータスコードでもどんと来い!
全てのエラーで任意のエラーページを出力する
Laravel 5 custom error view for 500

ログ

Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);

スポンサーリンク