ruby-使用子异常重新引发异常
我来自一个C#背景,在那里我通常会重新引发异常,而原始异常包含在父异常中。Ruby中是否有类似的概念?如何在维护较低级别异常的上下文的同时检测并引发异常?看一下Avdi Grimm演讲中的技巧: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 # ...
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
,则原因将由原始异常填充