Сообщение об ошибке (обратная трассировка) изменяется соответственно:
class Test
def self.fun_ok(name)
class_eval <<-CODE, __FILE__, __LINE__ + 1
def #{name}; raise; end
CODE
end
def self.fun_ko(name)
class_eval <<-CODE
def #{name}; raise; end
CODE
end
end
Давайте создадим методы:
Test.fun_ok("ok")
Test.fun_ko("ko")
Давайте проверим:
begin
Test.new.ok
rescue => e
puts e.backtrace.inspect
end
#⇒ ["/tmp/foo.rb:4:in `ok'", "/tmp/foo.rb:19:in `<main>'"]
begin
Test.new.ko
rescue => e
puts e.backtrace.inspect
end
#⇒ ["(eval):1:in `ko'", "/tmp/foo.rb:25:in `<main>'"]
Как вы можете видеть, первая обратная трассировка указывает на точную строку в исходном коде, которая привела к исключению (в частности: "/tmp/foo.rb:4"
part.) Последняя указывает на никуда.