エラーには2種類ある✌️
①業務エラー
→ ユーザーに不備がある際のエラー
- ユーザー登録時にパスワードの文字数が少ない
- 権限のないページにアクセスした
- すでに登録済みのメアドでユーザー登録をしようとした
【画面設計】
- バリデーションエラー
【内部処理】
- saveメソッドなどでtrue/falseを返し、分岐処理をさせる必要がある
- モデルのバリデーションで検証し、エラー内容はモデルのerrorsに格納する
②システムエラー
→ システム運用者、開発者に不備がある
- データベースがダウンしている
- マイページ画面の実装にバグがある
- データ異常やデータの不整合がある
- API連携の失敗
【画面設計】
- 500エラー
【内部処理】
- ログへのエラー出力と、500エラー画面の表示はRailsが自動でやってくれる
- データを保存するとき、「普通に考えると業務エラーが起こらない場合」や「万一エラーが起きたら処理を中止したい場合」はsaveじゃなくsave!メソッドを使用
例外を捕捉して処理を続行する🚶
例外が発生したときに例外処理を書いておかないと、例外が発生した時点でプログラムが停止してしまい、それ以降に記述してあるコードが読み込まれない
基本的な方法
begin
- 何かエラーが起きた場所で例外処理という方法でエラーを通知する
- 例外処理では、エラーが起きた場所で例外オブジェクトを生成し、呼び出し元に返す
- 処理しない場合は、順番に上の呼び出し元に返されていき、最終的にはプログラムが異常終了する
rescue
- 例外が発生した際に、この部分以下の処理を実行する
プログラムの実行をストップさせないために、begin
〜rescue
〜end
のブロックを作成して、例外オブジェクトを「捕捉」して適切な処理を行わないといけない
begin
# 通常の処理
rescue
# エラー発生時の処理
end
例外オブジェクトから情報を取得する方法
- Rubyで発生した例外自身もオブジェクト
- 例外オブジェクトのメソッドを呼び出すことで、情報を取得することができる
↓↓Exceptionクラス(全ての例外の祖先のクラス)
begin
# 通常の処理
rescue => e # 例外オブジェクトを格納する変数
puts e.class # エラークラス
puts e.message # エラーメッセージ
puts e.backtrace # バックトレース(メソッドの呼び出し状況を表したデータ)
end
バックトレースとは・・・大雑把にいうと「メソッドの呼び出し状況を表したデータ」です。バックトレースを使うと、以下のようなことができます。
・メソッドがどこから呼び出されたかを調べる
・例外が発生された場所を偽装する
引用:https://magazine.rubyist.net/articles/0031/0031-BackTrace.html
例外クラスを指定して捕捉する例外を限定する方法
- rescue には、捕捉する例外の種類を書くことが出来る
- 複数のresucueを指定することも可能
- 注意点としては、指定した例外クラス以外は捕捉されないのでプログラムは異常終了する
begin
# 通常の処理
rescue ArgumentError # 捕捉したい例外クラス
# エラー発生時の処理
rescue StandardError # 捕捉したい例外クラス
# エラー発生時の処理
end
参考記事