有什麼區別 - 技術,哲學,概念,或以其他方式 -`raise「foo」`和`raise Exception.new(「foo」)``有什麼區別?
raise "foo"
和
raise Exception.new("foo")
之間?
有什麼區別 - 技術,哲學,概念,或以其他方式 -`raise「foo」`和`raise Exception.new(「foo」)``有什麼區別?
raise "foo"
和
raise Exception.new("foo")
之間?
技術上,第一引發設置爲"foo"
消息拋出一個RuntimeError,並且第二引發設置爲"foo"
消息的異常。
實際上,當您想要使用前者和何時使用後者時,會有顯着的差異。
簡而言之,你可能想要一個RuntimeError
而不是一個Exception
。沒有參數的救援區塊將捕獲RuntimeErrors
,但不會捕獲Exception
s。所以,如果你在你的代碼引發Exception
,這個代碼將不能抓住它:
begin
rescue
end
爲了趕上Exception
你將不得不這樣做:
begin
rescue Exception
end
這意味着,在一定意義上,Exception
是一個比RuntimeError
更糟的錯誤,因爲你必須做更多的工作才能從中恢復。
所以你想要什麼取決於你的項目如何做錯誤處理。例如,在我們的守護進程中,主循環有一個空白的救援,它會抓住RuntimeErrors
,報告它們,然後繼續。但是在一兩種情況下,我們希望守護進程真的死於一個錯誤,在這種情況下,我們提出一個Exception
,它直接通過我們的「正常錯誤處理代碼」。
再次,如果你正在寫庫代碼,你可能想要一個RuntimeError
,不是Exception
,爲您的圖書館的用戶會感到驚訝,如果它引發的錯誤,空白rescue
塊不能趕上,這將需要他們有一段時間才明白爲什麼。
最後,我應該說RuntimeError
是StandardError
類的子類,而實際規則是,雖然可以raise
任何類型的對象,空白rescue
將默認只抓到任何東西,從StandardError
繼承。其他一切都必須具體。
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
非常豐富,謝謝。一些事情:[1]最後一段最具啓發性,讓我在irb上發現一些你沒有提到的事情:因此,RuntimeError
2011-01-26 21:49:33