Ruby 2.6 の変更点 - KeyError, NameError, NoMethodError

Ruby2.6アドベントカレンダーの11日目の記事です。

qiita.com

KeyError

KeyError.new:receiver, :key オプション追加

https://bugs.ruby-lang.org/issues/14313

KeyError は Hash#fetch で存在しないキーを指定した時などに発生する例外です。 KeyError#receiverKeyError#key でエラーが発生したオブジェクトとエラーの原因になったキーを知ることができます。

h = {a: 123}
begin
  h.fetch(:hoge)
rescue KeyError => e
  e.receiver #=> {:a=>123}
  e.key      #=> :hoge
end

この receiverkey は 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 と同様です。