例外処理
昨日Tamarbのチェリー本輪読会で、例外処理について学んだので、忘れないうちに改めてまとめてみることにします!
例外処理とは
例外処理とは、プログラム実行中にエラー(例外)が発生した際、どのように対処するかという処理です。
この処理を書いておくことで、エラーが発生した際、プログラムが終了してしまうのを防ぐことができます。
Rubyの例外クラス
主な例外クラスの継承関係は以下のようになっています。
Exception
NoMemoryError
ScriptError----------LoadError
NotlmplementedError
SyntaxError
SecurityError
SignalExceptipn---Interrupt
StandardError------ArgumentError
Encoding_error
FiberError
IOError
IndexError
LocalJumpError
Math::DomainError
NameError--------NoMethodError
RangeError
RegexpError
RuntimeError
SystemCallError
ThreadError
TypeError
ZeroDibisionError
SystemExit
SystemStackError
fatal
詳しくは、以下のリンクに載っています。
基本的な構文
例外が起きた時の処理は、基本的に以下の構文を用います。
begin
#処理
rescue => e #例外オブジェクト
#例外が起きた時の処理
end
例
例外オブジェクトを変数に代入
また、rescueでは具体的にどんなエラーが発生したのか出力させることが一般的です。
エラーオブジェクトを変数に代入し、その変数を使って情報を出力させることができます。
例外オブジェクトは、rescue => 例外オブジェクト というように代入します。
例外オブジェクト.class とすると、例外オブジェクトのクラス、
例外オブジェクト.message とすると、例外オブジェクトのメッセージ、
例外オブジェクト.backtrace とすると、例外が発生するまでの道筋が取得できます。
例
ensureを使う例外処理
エラーが発生したとしても、必ず実行してほしい処理がある際は、ensure を使います。
begin
#処理
rescue => e #例外オブジェクト
#例外が起きた時の処理
ensure
#必ず実行してほしい処理
end
例
raiseを使う例外処理
raiseを使用すると、rescueしたエラーを再度発生させることができます。
エラーが発生した際プログラムは終了させつつ、エラー内容をログに残したい時などに使います。
例
例外処理を使う上での注意点
・例外が発生したら極力、以上終了させるか、フレームワークに処理を投げるようにします。
(安易にrescueしてしまうと、処理中のデータ構造が崩れてしまったり、別の問題が発生してしまう可能性があります。)
・例外処理より条件分岐を使います。
・対象範囲と対象クラスを絞り込みます。
(異常終了されるべき例外まで、rescueしてしまうのを防ぎます。)