从导致错误的评估字符串中检索行



首先 - 我知道风险并已采取预防措施使用eval - 不是我在这里问的问题。

我想从使用 eval 中检索堆栈跟踪/正确的错误行,可能使用输入的多行代码字符串,我想从失败的 eval 字符串中获取该行。

eval_str = <<EOF
def illegal_stuff
  5 / 0 # This will cause a crash
end
5 + 2
illegal_stuff
42
EOF
begin
  eval(eval_str)
rescue => ex
  ex.backtrace # ???
end

不知何故,我想检索字符串"5 / 0 # This will cause a crash" 回溯似乎没有行号、字符数或类似的东西。

我尝试添加eval(eval_str, binding, "__FILE__", "__LINE__") - 但没有注意到差异。

有没有办法检索行号/位置/任何可以帮助我检索导致问题的代码行?

这是一种将错误推近原点的方法:

def yolo(code)
  from = caller_locations.first
  eval(code, binding, from.path, from.lineno)
end
yolo <<END
1/0
END

出现错误的地方如下:

yolo.rb:7:in `/': divided by 0 (ZeroDivisionError)

回溯似乎没有行号、字符数或类似的东西。

不是吗?这适用于我的红宝石:

begin
  eval(eval_str)
rescue => ex
  eval_str.lines[ex.backtrace.first[/^(eval):(d+):/, 1].to_i - 1]
end

最新更新