例外処理

昨日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                                                                      

詳しくは、以下のリンクに載っています。

docs.ruby-lang.org

 

 

 

基本的な構文

例外が起きた時の処理は、基本的に以下の構文を用います。

begin

  #処理

rescue  =>  e  #例外オブジェクト

  #例外が起きた時の処理

end

 

gyazo.com

 

 

 

例外オブジェクトを変数に代入

また、rescueでは具体的にどんなエラーが発生したのか出力させることが一般的です。

エラーオブジェクトを変数に代入し、その変数を使って情報を出力させることができます。

例外オブジェクトは、rescue => 例外オブジェクト というように代入します。

例外オブジェクト.class とすると、例外オブジェクトのクラス、

例外オブジェクト.message とすると、例外オブジェクトのメッセージ、

例外オブジェクト.backtrace とすると、例外が発生するまでの道筋が取得できます。

 

gyazo.com

 

ensureを使う例外処理

エラーが発生したとしても、必ず実行してほしい処理がある際は、ensure を使います。

begin

  #処理

rescue => e  #例外オブジェクト

  #例外が起きた時の処理

ensure

  #必ず実行してほしい処理

end

 

gyazo.com

 

 

raiseを使う例外処理

raiseを使用すると、rescueしたエラーを再度発生させることができます。

エラーが発生した際プログラムは終了させつつ、エラー内容をログに残したい時などに使います。

 

gyazo.com

 

 

例外処理を使う上での注意点

・例外が発生したら極力、以上終了させるか、フレームワークに処理を投げるようにします。

(安易にrescueしてしまうと、処理中のデータ構造が崩れてしまったり、別の問題が発生してしまう可能性があります。)

 

・例外処理より条件分岐を使います。

・対象範囲と対象クラスを絞り込みます。

(異常終了されるべき例外まで、rescueしてしまうのを防ぎます。)