Deveroper メモ

記事内容に絶対の保証はなく..どちらかというと自分用のノウハウ蓄積ページ。 それでも良ければ見ていってください。

Ruby の rescue

今更ながら Ruby技術者認定試験のGOLD を受けようと思い
模擬試験問題を解いていたところ...奇妙なコードに出くわした。
忘れると痛い目を見そうなので、ここに記述する

begin
  'aaa'.bbbb
rescue
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね

何も問題はない

begin
  'aaa'.bbbb
rescue NoMethodError
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね

これも問題ない
期待通りの動きである

begin
  'aaa'.bbbb
rescue NameError
  puts "レスキュー出来たね"
end

#=> レスキュー出来たね
  • むむ?
    • エラーの種類が違うのでは?
begin
  'aaa'.bbbb
rescue StandardError
  puts "ここには来ないよね?"
rescue NoMethodError
  puts "レスキュー出来たね"
end

#=> ここには来ないよね?

来てしまったのである
原因を追うと...

NoMethodError の親クラス = NameError
NameError の親クラス = StandardError

という事みたい。
トラップだな。気をつけないとね。