浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【Laravel】report関数で例外を握りつぶさない様にする

 この記事において”例外を握りつぶす”とは次の2の意味を転じて”例外の情報を記録しないまま処理を終端まで続ける”という動作を意味します。

[動サ五(四)]

1 強く握ってつぶす。「粘土を―・す」

2 意見・提案などを手もとに故意にとどめ、処置しないままにして、うやむやにする。「要求を―・す」
握り潰す(にぎりつぶす)の意味 – goo国語辞書

 つまり、真に握りつぶす

try{
  // 色々な処理
} catch (Exception $exception) {}

のみでなく

try{
  // 色々な処理
} catch (Exception $exception) {
  return JsonResponse::create('hoge');
}

といった例外を記録しない例外処理のことも、例外を握りつぶしている、と扱います。
 Laravelはデフォルトで例外処理をよしなに処理してくれます。具体的にはキャッチしてログに残し、例外発生直後は例外の理由と原因を示すリッチなエラー画面を見せてくれます。Laravel謹製の機能ならばより適した個別の処理もしてくれます(バリデーションならエラーメッセージ付きリダイレクト、など)。内部を詳しく知りたい方はエラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ – Qiitaなどを読むとよいです。
 なにもせず放っておけばいい感じになるのですが、try, catchしなければいけない時もあります。例えば、画面遷移するフォームにおける例外処理は400番台エラーページにユーザを飛ばすのでなく、特定のページにリダイレクトさせたいです。Exception\Handlerに記述を逐一増やすことでリダイレクトを対応する方法がありますが、これは危険な密結合をしている巻物コードが生まれやすいです。コントローラ毎にtry, catchすることになるでしょう。
 コントローラ内でtry, catchしてリダイレクトさせるならば次の様なコードが考えられます。

        try {
             // いろいろな処理
        } catch (Exception $exception) {
            return redirect()->route('宛先')->with([
                'msg' => '保存に失敗しました' // エラーメッセージ
            ])->withInput(); // リクエストで送られてきた入力を差し戻す
        }

 このようにすると、ユーザに謎の遷移を見せずに済みます。しかし、これだけでは最初に挙げた”例外を握りつぶすコード”そのものです。Laravelの例外処理を一切通さずいきなりレスポンスを返しているため、ログに何も残りません。デバッグは困難になり、プログラムの運用者、保守者は絶句することでしょう。
 Laravelのreport関数は簡単にこの問題を解決します。

        try {
             // いろいろな処理
        } catch (Exception $exception) {
            report($exception);// 例外の内容を詳しくログに残す

            return redirect()->route('宛先')->with([
                'msg' => '保存に失敗しました' // エラーメッセージ
            ])->withInput(); // リクエストで送られてきた入力を差し戻す
        }

 例外処理の頭にreport($exception);と加えただけです。これだけで例外に適したログをLaravelが残してくれます。

  • この記事いいね! (1)