我试图找出如何挽救在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'中的错误)吗?

推荐答案

那很简单...

事实证明,默认情况下,"rescue"语句不会捕获all个异常,只捕获StandardError的子类.SyntaxError是StandardError的sibling /表亲,而不是它的子类,因此除非明确告知,否则rescue语句不会捕获它.

要让rescue block捕获all个异常,您需要将代码更改为以下内容:

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

Note the change in the "rescue" line, from "rescue => exc" to "rescue Exception => exc".

现在,当您运行代码时,您将获得所需的结果:

2
RESCUED!

Ruby相关问答推荐

Ruby Case语句和固定,不适用于attr_reader

当 node 名称是/包含整数时,使用 Nokogiri 解析非 XML 文档

从 URL 字符串中提取主机的 Ruby 代码

Ruby数组中的`return`#map

Ruby - 将块传递给方法

使用正则表达式在第一个逗号之前提取文本

如何在 Ruby 中解冻对象?

查找两个数组之间的共同值

如何通过匹配文本来 Select node

ruby datetime 中有 add_days 吗?

将哈希转换为 struct

如何在 Ruby 中创建私有类常量

. vs ::(点与双冒号)用于调用方法

什么是匹配不在行尾的字符串的正则表达式?

如何在不等式中使用Ruby case ... when?

如何在 Ruby 中遍历多行字符串?

rbenv、rvm 和 chruby 有什么区别?

为什么 Ruby 无法验证 SSL 证书?

通过 factory_girl 协会查找或创建记录

查找模块中可用的类