今更ながら 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
という事みたい。
トラップだな。気をつけないとね。