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