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

Nip*_*rus 11 ruby exception-handling exception

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

Hen*_*rik 13

看看Avdi Grimm 的演讲特别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
Run Code Online (Sandbox Code Playgroud)


Ali*_*kau 6

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

class StandardError
   attr_accessor :original
end
Run Code Online (Sandbox Code Playgroud)

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

def reraise ex, original
   ex.original = original
   raise ex
end

rescue StandardError => e
   reraise ArgumentError.new('Message'), e
end
Run Code Online (Sandbox Code Playgroud)

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

对于 ruby​​ 2.1 及更高版本,您可以使用Exception#cause另一个答案中提到的方法。


Ali*_*kau 6

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

  • 如果您在`rescue`块内`raise NewException`,则原因被原始异常填充 (3认同)
  • 好的...但是当你引发异常时,你实际上如何使用它? (2认同)