我正在尝试改进嵌套异常的回溯。目前我有这个:
def upsert(doc)
get(doc.id) ? update(doc) : insert(doc)
rescue => ex
raise RepositoryError, "#{ex.class}: #{ex.message}"
end
在我的 upsert 方法中,我想将任何异常包装到通用异常中。这个解决方案有效,但有一个恼人的副作用:真正问题的回溯丢失(获救的例外)
我可能会进一步解决使用内部异常中的一个替换回溯的问题:
raise RepositoryError, "#{ex.class}: #{ex.message}", ex.backtrace
这显示了具有真正问题的回溯,但不包括引发 RepositoryError 的行。我可以使用__FILE__:__LINE__
来扩展ex.backtrace
,但插入并不简单,因为我必须在回溯中找到正确的位置。
因为这似乎是一个基本的共同需求:是否有更简单的方法来实现我想要做的一切?
答案 0 :(得分:0)
我也在寻找Java等价的嵌套异常。到目前为止,似乎Nesty是要走的路。 I see that Charles Nutter requested #cause要添加到核磁共振成像中,有些东西是,但它没有显示。
class HappyError < StandardError
include Nesty::NestedError
end
begin
raise 'foo'
rescue => e
raise HappyError.new
end
看起来很简单(注意这隐含了可以通过$访问的原因!)