【问题标题】:ruby - re-raise exception with sub-exceptionruby - 用子异常重新引发异常
【发布时间】:2012-01-13 02:10:45
【问题描述】:

我来自 C# 背景,我通常使用包含在父异常中的原始异常重新引发异常。 Ruby 中是否有类似的概念?如何在维护较低级别异常的上下文的同时检测并引发异常?

【问题讨论】:

    标签: ruby exception exception-handling


    【解决方案1】:

    看看 Avdi Grimm 的演讲 Exceptional Ruby 中的技巧:

    class MyError < StandardError
      attr_reader :original
      def initialize(msg, original=nil);
        super(msg);
        @original = original;
      end
    end
    # ...
    rescue => error
      raise MyError.new("Error B", error)
    end
    

    【讨论】:

    • 您不必将 msg 作为参数包含在 do super(msg) 中。如果您确实通过这些更改引发 MyError(error), 'some message',则 'some message' 将作为隐式参数传递。
    【解决方案2】:

    Ruby 2.1 添加了Exception#cause 功能来解决这个问题。

    【讨论】:

    • 好的...但是当您引发异常时,您如何实际使用它?
    • 如果你在rescue 块内raise NewException,则原因被原始异常填充
    【解决方案3】:

    对于 Ruby 2.1 之前的版本,您可以扩展 StandardError:

    class StandardError
       attr_accessor :original
    end
    

    当您引发异常时,只需设置此属性:

    def reraise ex, original
       ex.original = original
       raise ex
    end
    
    rescue StandardError => e
       reraise ArgumentError.new('Message'), e
    end
    

    使用这种方法,您将能够引发标准 ruby​​ 错误并为其设置父错误,而不仅仅是您的自定义错误。

    对于 ruby​​ 2.1 及更高版本,您可以使用Exception#cause,如另一个答案中所述。

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2014-11-28
      • 2010-12-25
      • 2017-10-05
      • 2016-03-18
      • 1970-01-01
      • 2011-09-12
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多