errors/message/detailed_parens.rb

tests/_examples/errors/message/detailed_parens.rb in the metorex repository.

# `Exception#detailed_message` decorates the message with the class name, or
# stands in for an empty one. `#full_message` renders the whole thing the way
# an uncaught exception is printed.

puts(RuntimeError.new("new error").detailed_message)
puts(RuntimeError.new("").detailed_message)
puts(StandardError.new("").detailed_message)
puts(RuntimeError.new("new error").detailed_message(foo: true))

# An anonymous class has no name to decorate with.
anonymous = Class.new(RuntimeError)
puts(anonymous.new("message").detailed_message)
puts(anonymous.new("message").class.equal?(anonymous).to_s)
puts(anonymous.new("message").is_a?(RuntimeError).to_s)

reported = RuntimeError.new("Some runtime error")
reported.set_backtrace(["a.rb:1", "b.rb:2"])
puts(reported.full_message(highlight: false, order: :top))
puts(reported.full_message(highlight: false, order: :bottom))

# A class that defines its own `detailed_message` decides how it reads.
custom = Exception.new("new error")
def custom.detailed_message(**)
  "<prefix>#{message}<suffix>"
end
puts(custom.detailed_message)
puts(custom.full_message(highlight: false).include?("<prefix>new error<suffix>").to_s)

Output:

new error (RuntimeError)
unhandled exception
StandardError
new error (RuntimeError)
message
true
true
a.rb:1: Some runtime error (RuntimeError)
	from b.rb:2
Traceback (most recent call last):
	from b.rb:2
a.rb:1: Some runtime error (RuntimeError)
<prefix>new error<suffix>
true