当表达式中存在错误时,无法使用`eval`获得堆栈跟踪

时间:2015-11-20 23:03:45

标签: ruby eval

我在这个救援块的大块代码上使用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__)

但他们没有提供有关错误所在行号的任何其他信息。

1 个答案:

答案 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]