如何在Ruby中拯救eval?

我试图找出如何解决在Ruby 1.8.6中使用eval()代码时出现的语法错误。

我期望以下的Ruby代码:

#!/usr/bin/ruby

good_str = "(1+1)"
bad_str = "(1+1"    # syntax error: missing closing paren

begin
    puts eval(good_str)
    puts eval(bad_str)
rescue => exc
    puts "RESCUED!"
end

运行时产生以下结果:

2
RESCUED!

相反,我得到的是:

2
eval_rescue.rb:8: (eval):1: compile error (SyntaxError)
(eval):1: syntax error, unexpected $end, expecting ')'

看来由eval方法引发的SyntaxError正在eval内的某个地方获救,而没有给我一个机会来处理它。

任何人有任何想法如何得到我想要的行为(即,我的'救援'条款从'eval'捕获错误)?


布伦特已经得到了一个可行的答案,但我建议从最小的例外中拯救出来。 这可以确保你不会意外地吞噬你不想要的东西。

从而,

begin
  puts eval(good_str)
  puts eval(bad_str)
rescue SyntaxError => se
  puts 'RESCUED!'
end

那很简单...

事实证明,默认情况下,“rescue”语句不会捕获所有的异常,而只是那些属于StandardError子类的异常。 SyntaxError是StandardError的兄弟/表亲,不是它的子类,所以除非明确告知,否则rescue语句不捕获它。

要让救援块捕获所有异常,您需要将代码更改为以下内容:

#!/usr/bin/ruby

good_str = "(1+1)"
bad_str = "(1+1"    # syntax error: missing closing paren

begin
    puts eval(good_str)
    puts eval(bad_str)
rescue Exception => exc
    puts "RESCUED!"
end

请注意“救援”线路中的更改,从“rescue => exc”到“rescue Exception => exc”。

现在,当您运行代码时,您会得到期望的结果:

2
RESCUED!
链接地址: http://www.djcxy.com/p/25839.html

上一篇: How to rescue an eval in Ruby?

下一篇: How do I add information to an exception message in Ruby?