ruby - 使用子异常重新引发异常

时间:2011-12-05 09:56:39

标签: ruby exception exception-handling

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

3 个答案:

答案 0 :(得分:13)

看看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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

对于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