Rubyにおける例外処理
例外を補足しない場合は、Rubyではそこでプログラムが中断することになります。(なお、補足したとしても補足後の動作を終えたらそこで処理は終了します。)
構文
1 2 3 4 5 6 7 8 9 |
begin #例外が起こり得る処理 rescue 補足したい例外の種類1,補足したい例外の種類2 => e(例外オブジェクトを格納する変数) #例外処理 #beginをもう一度行いたい場合に使用(その場合は例外処理内で例外が起きないよう処理を記述します。) retry ensure #例外の発生有無に関わらず実行したい処理 end |
retryの注意
retryをすればbeginをもう一度実行させることができますが、rescue内の例外処理にてエラーを解消するためのコードを書かなければ永遠に処理が継続されてしまいます。
ensure
ファイルの閉じ忘れを防ぐために使ったりします。
補足したい例外の種類
これをresuceで指定した場合は該当の例外が発生した場合のみ例外処理が行われることになります。
具体例
- ZeroDivisionError
- NoMethodError
例外オブジェクト
resucue文で例外を補足すると格納されます。上記例で言えば「e」のことです。
messageメソッド
例外発生時のメッセージを出力させることができます。
classメソッド
例外オブジェクトの種類を表示させることができます。
backtraceメソッド
例外のバックトレース情報を出力させることができます。
full_messageメソッド
例外に関する整形された情報を出力させることができよく使われます。
例外を意図的に発生させる。
下記のように記述すればプログラムの任意の箇所で例外を意図的に発生させることができます。
1 |
raise 例外の種類(ArgumentError等),"例外メッセージ内容" |
なお、例外の種類を指定しなかった場合は「RuntimeError」が発生します。
独自例外
「StandardError」クラスを独自例外クラスに継承させて実装します。
例外の実装方針
基本的には、rescueを安易に使わないようにし例外が発生したらプログラムを中断させるようにしましょう。
また、最近であればRailsのフレームワークが自動で例外処理までしてくれるので自分でrescueで処理を書かなくても委ねることも可能です。
rescueを使った方が良い場合
ただ、例外はあります。例えば、DBへの登録処理で一部が失敗したからと言って全体の登録を中断するというのでは要件的に困るケースとかもあったりします。その場合は例外が発生してプログラムが中断すると困るのでrescueで処理を続行するようにしましょう。
ただ、その場合でも後で原因解析しやすいように例外が発生したクラス名、エラーメッセージ、バックトレース情報だけは最低限出力させるような仕様にしましょう。
この記事へのコメントはありません。