【问题标题】:Cutting off from backtrace the steps coming from particular libraries从回溯中切断来自特定库的步骤
【发布时间】:2013-02-18 11:30:02
【问题描述】:

有时,我们使用经过良好调试且通常不会导致错误的库。尽管如此,这些库仍可能由于我们滥用其 API 而返回错误。在这种情况下,这些库内部的步骤会显示在错误的回溯中,从使用库的程序员的角度来看,这只是垃圾,并且很难发现错误的原因。甚至核心 Ruby 中的一些方法也会在回溯中插入一些内部步骤。例如,每当您看到涉及Enumerable#inject 的回溯时,总会从其中调用Enumerable#each,这会出现在回溯中并且很烦人。

  1. 从回溯中删除某些给定库的内部步骤的好方法是什么?我目前正在通过解析回溯并按文件名过滤它。有没有更好的方法?

  2. 当您自己编写库时,是否有一种好的方法可以抑制出现在涉及使用该库的方法调用的回溯中的内部步骤?一种明显的方法可能是为要从库外部使用的每个方法插入一对rescueraise,但这似乎不正确。

【问题讨论】:

  • Enumerable#reject FTW :)
  • 看起来像方面(我更喜欢aquarium for ruby​​)是你正在寻找的。见 e。 G。 “Wrapping” an Exception(向下滚动几个屏幕。)

标签: ruby backtrace


【解决方案1】:

嗯……

  1. 真的没有更好的过滤方法。但是,如果您可以获得回溯的完整文件路径,则可以按目录过滤,从而排除所有标准库和 gem。除此之外,麻烦多于其价值。
  2. 对此有更好的解决方案。但是,它要求您在库中捕获 Ruby 抛出的所有异常,然后在执行此操作后重新抛出它们(也对您自己的所有异常执行此操作)。所以用这个包装你的所有方法:

    begin
      ...
    rescue Exception
      e = $!  
      e.set_backtrace(caller(nesting_level))
      raise e
    end
    

    nesting_level 是从这个库中调用当前方法的方法数。如果它是直接从用户代码调用的,则输入 0。如果它是由用户代码中调用的一种方法调用的,则输入 1,以此类推。

【讨论】:

  • 我无法完全理解您在 2 中的建议。您能详细说明一下吗?
猜你喜欢
  • 2023-04-09
  • 2017-08-16
  • 2020-02-22
  • 2020-04-04
  • 2012-06-18
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2013-01-16
相关资源
最近更新 更多