2011-01-26 85 views

回答

100

技術上,第一引發設置爲"foo"消息拋出一個RuntimeError,並且第二引發設置爲"foo"消息的異常。

實際上,當您想要使用前者和何時使用後者時,會有顯着的差異。

簡而言之,你可能想要一個RuntimeError而不是一個Exception。沒有參數的救援區塊將捕獲RuntimeErrors,但不會捕獲Exception s。所以,如果你在你的代碼引發Exception,這個代碼將不能抓住它:

begin 
rescue 
end 

爲了趕上Exception你將不得不這樣做:

begin 
rescue Exception 
end 

這意味着,在一定意義上,Exception是一個比RuntimeError更糟的錯誤,因爲你必須做更多的工作才能從中恢復。

所以你想要什麼取決於你的項目如何做錯誤處理。例如,在我們的守護進程中,主循環有一個空白的救援,它會抓住RuntimeErrors,報告它們,然後繼續。但是在一兩種情況下,我們希望守護進程真的死於一個錯誤,在這種情況下,我們提出一個Exception,它直接通過我們的「正常錯誤處理代碼」。

再次,如果你正在寫庫代碼,你可能想要一個RuntimeError,不是Exception,爲您的圖書館的用戶會感到驚訝,如果它引發的錯誤,空白rescue塊不能趕上,這將需要他們有一段時間才明白爲什麼。

最後,我應該說RuntimeErrorStandardError類的子類,而實際規則是,雖然可以raise任何類型的對象,空白rescue將默認只抓到任何東西,從StandardError繼承。其他一切都必須具體。

+1

非常豐富,謝謝。一些事情:[1]最後一段最具啓發性,讓我在irb上發現一些你沒有提到的事情:因此,RuntimeError 2011-01-26 21:49:33

26

From the offical documentation:

raise 
raise(string) 
raise(exception [, string [, array ] ]) 

不帶任何參數,提高在$!異常或提出了RuntimeError如果$!是零。使用一個String參數,它會將字符串作爲消息引發RuntimeError。否則,第一個參數應該是Exception類的名稱(或發送異常時返回Exception的對象)。可選的第二個參數設置與異常關聯的消息,第三個參數是一個回調信息數組。例外情況被begin...end區塊的救援條款捕獲。

raise "Failed to create socket" 
raise ArgumentError, "No parameters", caller 
相關問題