Ruby 2.6 KeyError#initialize接受消息、接收器和密钥作为参数

61 阅读1分钟

Ruby 2.6 KeyError#initialize接受消息、接收器和密钥作为参数

Ruby 2.6.0-preview2最近发布了

Ruby 2.5.0引入了公共实例方法 KeyError#keyKeyError#receiver.你可以在这里阅读我之前关于KeyError#key &KeyError#receiver 的博客。

Rubycsv 库在没有找到字段时,会在 KeyError当字段没有被找到时,在CSV::Row#fetch 方法上引发一个

def fetch(header, *varargs)
  # ...
  raise KeyError, "key not found: #{header}"
  # ...
end

与其引发如上所示的KeyError,不如这样做如何?

raise KeyError.new("key not found", key: header)

有了这个,我们可以使用Ruby 2.5.0中引入的KeyError#messageKeyError#key 方法来检查KeyError对象的错误信息和密钥:

begin
  raise KeyError.new('key not found', key: :unknown)
rescue StandardError => error
  p error.message #=> "key not found"
  p error.key #=> :unknown
end

有人建议引入KeyError#initialize 方法,该方法接受message,receiverkey 作为参数,以在KeyError 对象上设置它们,该方法被批准。

Ruby 2.6.0

在Ruby 2.6.0中,KeyError#initialize 接受message,receiver, 和key 作为参数,其中message 是一个默认参数,默认值为nil

KeyError#initialize

>> error = KeyError.new
=> #<KeyError: KeyError>

KeyError#message

>> error.message
=> "KeyError"

>> error = KeyError.new('Message')
=> #<KeyError: Message>
>> error.message
=> "Message"

message 没有传递给KeyError ,它就会设置class name 作为消息。

KeyError#initialize带有message, :receiver 和 :key

>> error = KeyError.new('Message', receiver: Object.new, key: :unknown)
=> #<KeyError: Message>
>> error.message
=> "Message"
>> error.receiver
=> #<Object:0x0000561132683d48>
>> error.key
=> :unknown

我希望KeyError 类的这些方法参数对你未来的调试尝试是有用的。