Railsの内部で発生するエラーは下記の2つに分類できます。
- アプリケーション固有のエラー(業務エラー、ユーザーに責任のあるエラー)
- Rails固有のエラー(システムエラー、システムの不具合で開発者に責任があるエラー)
アプリケーション固有のエラーの場合
プログラム実装方針
基本的にはrescue等の例外処理は行いません。false、true等で分岐処理を記述するようにしましょう。
rescue_fromメソッド
あまり使うことはないかもしれませんが、アプリのコントローラー内で発生するエラーで手軽にエラー画面を出したい場合はコントローラーにデフォルトで用意されているrescue_fromメソッドが使えます。
具体的には下記のように記述します。
1 2 3 4 5 6 7 8 9 |
class コントローラ rescue_from XXXError, with: エラー処理メソッド private def エラー処理メソッド(error) @error = error render :custom_error end end |
rescue_fromメソッドの注意点
非常に便利なメソッドなのですが、config.consider_all_requests_localの値に関わらず常時発動するためデバッグ時に不便になる点です。エラー詳細を隠す設定にしてしまうとアプリ固有のエラー内容まで隠蔽されてしまい開発速度が低下してしまう可能性があります。
Rails固有のエラーの場合(システムエラー)
プログラム実装方針について
Railsの共通処理が自動的にログに出力してくれるので基本的には何もしないのが正解です。rescueを使ってプログラムを続行させないようにしましょう。(Railsが自動でrescueの処理をしてくれています。)ただ、下記のような例外的なケースもあるので覚えておきましょう。
rescueを使いプログラムを続行させた方が良い例外的なケース
- DBに大量データ登録する処理で途中でエラーが発生したからといって全件登録をストップさせることが仕様として問題があるケースの場合
なお、やむおえずrescueでプログラムを続行させる場合はログ出力や通知は必ず行うようにしましょう。
通知するための代表的なRubyGem
- Bugsnag
- Rollbar
- Errbit
例外が発生した際に出す画面について
Railsは自動でログに障害内容を出力してくれますしエラー画面も自動で出してくれます。設定ファイルでどのように処理をさせるか決める必要があります。以下2つのどちらかの画面を出すという設定ができます。
- デバッグ用画面
- 本番用エラー画面
どの画面を出すかの設定ファイル
config/environments/development.rb
設定値
config.consider_all_requests_local
この値がtrueの時はデバッグ画面が表示されて、falseの時は本番用の画面が表示されます。(デフォルトではtrueに設定されているのでデバッグ用の画面が表示されることになります。開発されている中で何度か目にしたRailsのある行数でエラーが発生していますというような画面はデバッグ画面なのです。)
本番用エラー画面について
本番用エラー画面はHTTPステータスコードごとに用意されることになります。
ステータスコード | 説明 | HTMLの場所 |
---|---|---|
404 | ユーザーの求めているリソースを提供できない場合のエラー(Actionがない、データがない等) | public/404.html |
422 | public/422.html | |
500 | その他のシステムエラー全般 | public/500.html |
あくまで静的なページになります。ただ自分で好きなようなデザインをいじったりすることは可能です。
この記事へのコメントはありません。