1

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

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

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

4

1 回答 1

1

出色地...

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

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

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

于 2013-02-18T15:41:30.877 回答