在嵌套异常中进行回溯

时间:2015-04-01 20:12:49

标签: ruby exception

我正在尝试改进嵌套异常的回溯。目前我有这个:

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,但插入并不简单,因为我必须在回溯中找到正确的位置。

因为这似乎是一个基本的共同需求:是否有更简单的方法来实现我想要做的一切?

1 个答案:

答案 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

看起来很简单(注意这隐含了可以通过$访问的原因!)