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

问题描述 投票:11回答:3

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

ruby exception exception-handling
3个回答
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

5
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.