2013-02-18 25 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