当前位置:  开发笔记 > 编程语言 > 正文

如何在Ruby中拯救eval?

如何解决《如何在Ruby中拯救eval?》经验,为你挑选了2个好方法。

我正在试图找出如何解决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'中捕获错误)?



1> James A. Ros..:

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

从而,

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


这是个好建议.例如,抢救Exception而不是SyntaxError将阻止您使用ctrl-C中断进程.

2> Brent Chapma..:

嗯,这很容易......

事实证明,默认情况下,"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!

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有