【问题标题】:Ruby: Unwanted context in exceptions raised within an evalRuby:在评估中引发的异常中不需要的上下文
【发布时间】:2009-04-16 09:21:09
【问题描述】:

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

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!

没有使用正则表达式来替代它,在第二种情况下,有什么方法可以在没有上下文的情况下引发异常?

【问题讨论】:

    标签: ruby exception eval


    【解决方案1】:

    谢谢。反正我是在定义自己的错误,所以这很容易解决。

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

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

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

    【讨论】:

      【解决方案2】:

      这很不寻常,我以前没有遇到过。我看不到说服 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!
      

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

      (已更新以根据 Chris 在他的回答中所说的修复代码)

      【讨论】:

        猜你喜欢
        • 2017-06-20
        • 1970-01-01
        • 2020-03-14
        • 2023-03-18
        • 1970-01-01
        • 2011-08-08
        • 2020-03-06
        • 2018-06-06
        • 2010-11-24
        相关资源
        最近更新 更多