切断回溯来自特定图书馆的步骤

时间:2013-02-18 11:30:02

标签: ruby backtrace

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

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

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

1 个答案:

答案 0 :(得分:1)

嗯...

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

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

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