Ruby2.6アドベントカレンダーの11日目の記事です。
KeyError
KeyError.new に :receiver, :key オプション追加
https://bugs.ruby-lang.org/issues/14313
KeyError は Hash#fetch で存在しないキーを指定した時などに発生する例外です。
KeyError#receiver と KeyError#key でエラーが発生したオブジェクトとエラーの原因になったキーを知ることができます。
h = {a: 123}
begin
h.fetch(:hoge)
rescue KeyError => e
e.receiver #=> {:a=>123}
e.key #=> :hoge
end
この receiver と key は Ruby の C レベルのインタフェースでしか設定することはできませんでした。
2.6 から Rubyスクリプトから設定できるようになったので、自作クラスからも KeyError を使うことができるようになりました。
class Hoge def hoge(key) return true if [:a, :b, :c].include? key raise KeyError.new(receiver: self, key: key) end end begin Hoge.new.hoge(:x) rescue KeyError => e e.receiver #=> #<Hoge:0x000055dcbc56ec78> e.key #=> :x end
これを 2.5 で実行した場合は e.receiver の行で no receiver is available (ArgumentError) という例外が発生します(そして原因のエラー情報は失われる)。
NameError
NameError.new に :receiver オプション追加
https://bugs.ruby-lang.org/issues/14313
KeyError と同様です。
NoMethodError
NoMethodError.new に :receiver オプション追加
https://bugs.ruby-lang.org/issues/14313
KeyError と同様です。