Ruby 2.6 KeyError#initialize accepts message, receiver, and key as arguments
Ruby 2.6.0-preview2 was recently released.
Ruby 2.5.0 introduced public instance methods
KeyError#key and
KeyError#receiver.
You can read my earlier blog about KeyError#key & KeyError#receiver here.
Ruby csv library raises a KeyError on CSV::Row#fetch method when the field is not found.
def fetch(header, *varargs)
# ...
raise KeyError, "key not found: #{header}"
# ...
endInstead of raising a KeyError shown above, how about if this is possible? -
raise KeyError.new("key not found", key: header)with this we can check the KeyError object for the error message and key using
KeyError#message and KeyError#key methods which were introduced in Ruby 2.5.0.
begin
raise KeyError.new('key not found', key: :unknown)
rescue StandardError => error
p error.message #=> "key not found"
p error.key #=> :unknown
endIt was proposed that KeyError#initialize method should be
introduced which accepts message, receiver and key as arguments to set them on a
KeyError object and it was approved.
Ruby 2.6.0
In Ruby 2.6.0 KeyError#initialize accepts message, receiver, and key as
arguments, where the message is a default argument with default value as nil.
KeyError#initialize
>> error = KeyError.new
=> #<KeyError: KeyError>KeyError#message
>> error.message
=> "KeyError"
>> error = KeyError.new('Message')
=> #<KeyError: Message>
>> error.message
=> "Message"When message is not passed to KeyError it sets the class name as the message.
KeyError#initialize with message, :receiver and :key
>> error = KeyError.new('Message', receiver: Object.new, key: :unknown)
=> #<KeyError: Message>
>> error.message
=> "Message"
>> error.receiver
=> #<Object:0x0000561132683d48>
>> error.key
=> :unknownI hope these method arguments for KeyError class are useful in your future debugging attempts.
