如何在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内的某个地方救起,而没有给我一个自己处理的机会。

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

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

从而,

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

那么,那很简单…

事实certificate,默认情况下,“rescue”语句不会捕获所有的exception,而只是那些是StandardError的子类。 SyntaxError是StandardError的兄弟/表亲,而不是它的一个子类,所以除非显式地告诉rescue语句,否则rescue语句不会捕获它。

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

 #!/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!