【发布时间】:2012-01-13 02:10:45
【问题描述】:
我来自 C# 背景,我通常使用包含在父异常中的原始异常重新引发异常。 Ruby 中是否有类似的概念?如何在维护较低级别异常的上下文的同时检测并引发异常?
【问题讨论】:
标签: ruby exception exception-handling
我来自 C# 背景,我通常使用包含在父异常中的原始异常重新引发异常。 Ruby 中是否有类似的概念?如何在维护较低级别异常的上下文的同时检测并引发异常?
【问题讨论】:
标签: ruby exception exception-handling
看看 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
【讨论】:
Ruby 2.1 添加了Exception#cause 功能来解决这个问题。
【讨论】:
rescue 块内raise NewException,则原因被原始异常填充
对于 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,如另一个答案中所述。
【讨论】: