Rubyの例外処理復習
この記事について
Rubyの例外処理について「プロを目指す人のためのRuby入門」で復習してたので重要だと思ったところをまとめます。
rescue節は例外クラスを指定しなかった場合StandardErrorを継承していない例外クラスを捕捉しない
具体的には、NoMemoryError
, ScriptError
, SecurityError
など
なお、例外クラスを指定した場合はそのクラス自身とそのサブクラスを捕捉する
begin 1 / 0 rescue StandardError => e puts "#{e.class}" end #=> ZeroDivisionError # ZeroDivisionErrorはStandardErrorのサブクラス
例外発生時にもう一度処理をやり直す
rescue節でretry文を実行するとbegin節の最初から処理をやり直すことができる
counter = 0 begin '処理を開始します' 1 / 0 rescue counter += 1 if counter <= 3 puts "retryします: #{counter}回目" retry else puts 'retry失敗しました' end end # 実行結果 $ ruby test.rb retryします: 1回目 retryします: 2回目 retryします: 3回目 retry失敗しました
意図的に例外を発生させる
raise
メソッドを使うと意図的に例外を投げることができる
def greeting(country) case country when :japan 'こんにちは' when :us `hello` else raise "無効な国名です。#{country}" end end greeting(:japan) #=> こんにちは greeting(:us) #=> hello greeting(:korea) #=> RuntimeError: 無効な国名です。korea
この際、投げる例外のクラスを指定できるが、独自の例外を作ることもできる
class NoCountryError < StandardError; end def greeting(country) # 省略 raise NoCountryError, "無効な国名です。#{country}" # 省略 end greeting(:korea) #=> NoCountryError: 無効な国名です。korea
rescueは修飾子としても使うことができる
1 / 0 rescue 0 #=> 0
そのほか覚えておきたいこと
例外処理のベストプラクティス 機能としては用意されていても、それを使うべき時と使うべきでない時がある
例外処理より条件分岐を使う
- 安易に例外処理を使うと可読性が落ち、意図しない動作が起こる可能性が高くなりやすい
まとめ
忘れていたことも多く、良い復習になりました。 仕事ではRailsを使っているため、うまくレールに乗って不要なところで例外処理を書かなくていいように心がけようと思います。