一些背景:我在一個大的代碼庫(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
中被救出?
你可以假設外國的寶石有異常情況_something_,而不是默默地跳過它。嘗試將斷點放到'#message','#cause'等並檢查意外中斷。幸運的話,你會在堆棧頂部獲得調用者。 – mudasobwa
@mudasobwa確實,工作!在驗收測試中,由於'config.action_dispatch.show_exceptions = false',Rails本身解救了這個異常。 – Stefan
很酷。 Rails做了太多的魔術,這就是爲什麼我更喜歡COBOL :) – mudasobwa