我在这个救援块的大块代码上使用eval
:
rescue => e
logger.error e.message
e.backtrace.each { |line| logger.error line }
end
救援区块不提供例外的行号等。我得到这个:
undefined method `+' for nil:NilClass
当需要评估大量代码时,它不是很有用。我尝试了各种各样的事情,例如:
eval(exp, binding, __FILE__, __LINE__)
但他们没有提供有关错误所在行号的任何其他信息。
答案 0 :(得分:0)
可能这可以帮到你。这个答案有点基于this article的详细信息。假设您要在exp
变量中评估表达式,我将作为第3个参数传递的行号调整为String#module_eval
。
begin
exp = <<EOL
a = nil
a + 10
EOL
String.module_eval(exp,__FILE__, __LINE__ - 1 - exp.split("\n").size )
rescue Exception => e
puts e
puts e.backtrace
end
以上程序的输出:
undefined method `+' for nil:NilClass
E:/hello.rb:4:in `<main>'
E:/hello.rb:6:in `module_eval'
E:/hello.rb:6:in `<main>'
[Finished in 0.2s]