Rubyの例外処理を学ぶ
例外処理
例外は想定外の問題が起きたときに発生し、Rubyはエラーメッセージを表示してプログラムを停止する。
無理に処理を続けるよりは、その場でプログラムを止めた方が安全という考え方。
逆に、問題に対処できるのであれば、例外が発生してもプログラムを止めないほうがユーザに親切
例外を処理するためにはbegin~rescueを 使う
begin
code:begin.rb
begin
式..
[rescue error_type,.. => evar then
式..]..
[else
式..]
[ensure
式..]
end
例外の発生有無に関わらず実行したい処理はensure節に書く。
例外もオブジェクトの一種 ($!))
rescue節で個別の例外を 1つずつ指定するのではなく、親クラスの例外を指定することで、関連する例外をまとめて処理できる
例外クラス名を省略してrescue => eと書くと、Exceptionクラスから派生するすべての例外クラスをrescueできる。
rescue節を省略した場合は、StandardErrorクラスとそのサブクラスが捕捉される
即座にプログラムを停止させる方が安全な場合もある(一般的にはプログラムを続行させることが困難な状況で発生する例外)
メモリが足りないときに発生するNoMemoryError
プログラムの構文が間違っているときに発生するSyntaxError
すべての例外をrescueするのではなく対象にしたいサブクラスを書く
raise メソッドで例外を発生できる(raise 例外クラス名, "エラーメッセージ")
メソッドにブロックを渡すことで、ensure節を書かなくても自動的に終了処理を行ってくれることがある
Kernel.#openメソッドにおけるファイルのクローズ処理など
例外処理の返り値は、例外が発生しなかった場合はbegin節もしくはelse節、例外が発生し補足された場合はrescue節の最後の式となる
rescue修飾子を使って、begin~endを省略できる
式1 rescue 式2:式1で例外が発生した場合は、式2を評価する
補足する例外クラスを指定できず、StandardErrorクラスとそのサブクラスのみ捕捉される (rescue節の省略時と同じ)
メソッド内で、最初から最後までを例外処理とする場合は、beginとendを省略しても良い
rescue節で、別の例外が発生すると、原因調査が困難になる場合があるため注意すること
例外を捕捉した後でプログラムを異常終了させたい場合は、rescue節でraiseを書くことで、捕捉した例外を再度発生させる
独自の例外クラスを作成する場合は、StandardErrorクラスまたはそのサブクラスを継承しよう
class MyError < StandardError # ...
関連URL
Rubyスタイルガイドを読む: 例外処理|TechRacho by BPS株式会社
ruby-list:385 about exception
Rubyの例外処理のキーワードがrescueやensureなのは、Eiffelという言語から来ている
#ゼロからわかる_Ruby_超入門
#プロを目指す人のためのRuby入門
#Rubyを学ぶ