2013-02-18 63 views
0

有时,我们使用的库很好地调试,通常不会导致错误。不过,由于我们滥用API,这些库可能会返回错误。在这种情况下,这些库内部的步骤显示在错误的回溯中,从使用库的程序员的角度来看,这只是一个垃圾,并且很难找出错误的原因。即使核心Ruby中的一些方法也会在回溯中插入一些内部步骤。例如,无论何时看到涉及Enumerable#inject的回溯,始终都会调用Enumerable#each,该回调显示在回溯中并令人讨厌。从回溯中切断来自特定库的步骤

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

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

+1

'可枚举#reject' FTW :) – 2013-02-18 11:43:44

+1

貌似方面(我喜欢[水族馆](https://github.com/deanwampler/Aquarium)为Ruby)是你在找什么。见e。 G。 [“包装”例外](http://aquarium.rubyforge.org/examples.html)(向下滚动几个屏幕。) – mudasobwa 2013-02-18 12:10:45

回答

1

嗯......

  1. 确实没有更好的办法来进行筛选。但是,如果您可以获取完整的文件路径以进行回溯,则可以按目录进行过滤,从而排除所有stdlib和gems。除此之外,它比它的价值更麻烦。
  2. 对此有更好的解决方案。然而,它要求你捕捉Ruby中所有抛出的异常,然后在完成之后重新抛出它们(也可以对所有自己的异常做这件事)。所以,包装所有的方法与此:

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

    nesting_level是怎么这个库的方法很多当前的方法是从调用。如果它是从用户代码直接调用的,则将其设置为0.如果它是通过用户代码中调用的一种方法调用的,则将其放入1,依此类推。

+0

我不能完全得到你在2中的建议。你能详细说明一下吗? – sawa 2013-02-19 07:03:16

+0

@sawa:见编辑 – Linuxios 2013-02-19 13:47:42