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

ruby-使用子异常重新引发异常,ruby,exception,exception-handling,Ruby,Exception,Exception Handling,我来自一个C#背景,在那里我通常会重新引发异常,而原始异常包含在父异常中。Ruby中是否有类似的概念?如何在维护较低级别异常的上下文的同时检测并引发异常?看一下Avdi Grimm演讲中的技巧: class MyError < StandardError attr_reader :original def initialize(msg, original=nil); super(msg); @original = original; end end # ...

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

看一下Avdi Grimm演讲中的技巧:

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
class MyError错误
引发MyError.new(“错误B”,错误)
结束

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

ruby 2.1添加了解决此问题的功能。

您不必将msg作为参数包含在do super(msg)中。如果您确实引发MyError(错误),“some message”以及这些更改,“some message”将作为隐式参数传递。好的。。。但是,当您引发异常时,您实际如何使用它呢?如果您在
rescue
块中
raisenewexception
,则原因将由原始异常填充