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 と同様です。