1

Ruby Exceptions 中直接引发的消息和从 evals 中引发的消息之间似乎存在奇怪的差异。例如,下面的代码:

def foo
 raise "Help!"
end

puts "\nRescue foo"
begin
 foo
rescue RuntimeError => e
 puts e.message
end

puts "\nRescue eval 'foo'"
begin
 eval "foo"
rescue RuntimeError => e
 puts e.message
end

产生以下输出:

Rescue foo
Help!

Rescue eval 'foo'
./temp.rb:2:in `foo': Help!

没有使用正则表达式将其分出,在第二种情况下,有什么方法可以在没有上下文的情况下引发异常?

4

2 回答 2

2

谢谢。无论如何,我都在定义自​​己的错误,所以这很容易解决。

我做了一点改动,所以超类也被初始化了:

class MyException < RuntimeError
  attr_accessor :my_message
  def initialize(m)
    @my_message = String.new(m)
    super
  end
end

(似乎需要调用 String.new 来避免再次出现旧行为;大概 Exception.new 就地修改了消息。)

于 2009-04-16T09:44:45.247 回答
1

这很不寻常,我以前没有遇到过。我看不到说服 eval 不添加该信息的方法,因此要么执行您提到的正则表达式修改,要么您可以定义自己的错误类型:

class MyError < RuntimeError
  attr_accessor :my_message
  def initialize(m)
    @my_message = m.dup
    super
  end
end

def foo
 raise MyError.new("Help!")
end

puts "\nRescue eval 'foo'"
begin
 eval "foo"
rescue RuntimeError => e
 puts e.my_message
end

带输出:

Rescue eval 'foo'
Help!

在任何比简单脚本更大的东西中,定义自己的错误类型无论如何都是一种好习惯。

(更新以根据克里斯在他的回答中所说的修复代码)

于 2009-04-16T09:30:20.990 回答