从评估错误字符串中提取行

时间:2019-07-18 22:26:00

标签: ruby eval rescue

首先,我知道使用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__")-但没有发现差异。

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

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:0)

  

回溯似乎没有行号,字符数或类似内容。

不是吗?这适用于我的Ruby:

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