【问题标题】:Backtrace in nested exceptions嵌套异常中的回溯
【发布时间】:2015-06-06 15:18:03
【问题描述】:

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

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

因为这似乎是一个基本的常见需求:有没有更简单的方法来实现我想要做的所有事情?

【问题讨论】:

    标签: ruby exception


    【解决方案1】:

    我也在寻找嵌套异常的 Java 等价物。到目前为止,Nesty 似乎是要走的路。 I see that Charles Nutter requested #cause 被添加到 MRI 中,有些东西是,但它不显示。

    class HappyError < StandardError
      include Nesty::NestedError
    end
    
    
    begin
      raise 'foo'
    rescue => e
      raise HappyError.new
    end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多