2017-06-29 59 views
2

一些背景:我在一個大的代碼庫(Rails)中有一些Ruby代碼,在特定條件下引發異常。然而,例外情況不像預期的那樣「發生」,它被無聲地丟棄。我認爲其他一些代碼(寶石)可能會意外地拯救這個異常。如何確定在Ruby中正在救援的異常?

如何確定哪裏有異常正在救援?

我完全可以控制這個異常。所以也許有一種例外的方法可以知道什麼時候被救出?

人爲的例子:

# code outside my control 
def foo 
    yield 
rescue 
end 

def black_box(&block) 
    foo(&block) 
end 

# my code 
black_box do 
    puts 'about to raise' 
    raise 
    puts 'never gets here' 
end 

輸出:

about to raise 

所以異常被救出。我如何識別(從「我的代碼」中)它在foo中被救出?

+2

你可以假設外國的寶石有異常情況_something_,而不是默默地跳過它。嘗試將斷點放到'#message','#cause'等並檢查意外中斷。幸運的話,你會在堆棧頂部獲得調用者。 – mudasobwa

+1

@mudasobwa確實,工作!在驗收測試中,由於'config.action_dispatch.show_exceptions = false',Rails本身解救了這個異常。 – Stefan

+0

很酷。 Rails做了太多的魔術,這就是爲什麼我更喜歡COBOL :) – mudasobwa

回答

1

我能想到的唯一方法就是手動調試/檢查。

當您打算提出您希望跟蹤的異常時,請檢查當前的caller。這給你一個調用堆棧。現在訪問你的編輯器中的每一行/方法,並尋找過於貪婪的救援。

至於更「自動」的方式,我沒有看到任何。 Ruby異常沒有on_rescue回調或類似的東西,所以他們不知道他們正在被救出。

+0

115行的調用堆棧:-( – Stefan

+2

@Stefan:你很幸運,它是一個小的:) –

+0

無賴,'TracePoint'也沒有幫助,它有一個':raise'事件,但沒有':rescue'。 – Stefan