我正在试图找出如何解决eval()
在Ruby 1.8.6中使用代码时出现的语法错误.
我希望以下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中的某个地方被拯救,而我没有机会自己处理它.
任何人都知道如何获得我想要的行为(即,我的'rescue'条款从'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!