我在幾處提到異常情況可能很貴的地方看過。我有一個例外,我預計會發生一些頻率,我會每次都抓住它。這可能是一個天真的問題(像許多人,我遲到異常遊戲):我可以有一個異常的靜態全局實例嗎?
我可以創建一個靜態的全局實例我的異常和throw
它出現時(只有一種方法),捕捉它每一次?
這會讓我什麼時候都省心嗎?或者因爲我期望拋出一些頻率,只會從這一個方法(目前)拋出這個異常,並且總會捕獲這個異常,這是否表明我應該使用其他一些範式來處理這種情況?
感謝您的任何有幫助的答案!
我在幾處提到異常情況可能很貴的地方看過。我有一個例外,我預計會發生一些頻率,我會每次都抓住它。這可能是一個天真的問題(像許多人,我遲到異常遊戲):我可以有一個異常的靜態全局實例嗎?
我可以創建一個靜態的全局實例我的異常和throw
它出現時(只有一種方法),捕捉它每一次?
這會讓我什麼時候都省心嗎?或者因爲我期望拋出一些頻率,只會從這一個方法(目前)拋出這個異常,並且總會捕獲這個異常,這是否表明我應該使用其他一些範式來處理這種情況?
感謝您的任何有幫助的答案!
首先回答你的真正問題:
我可以創建例外的靜態全局實例,並把它當它出現(只能從一個方法),每次抓呢?
不是。拋出的異常對象總是新構造的,它每次都是唯一的對象。而且,異常對象的構建並不昂貴,異常控制流程也是如此。但
或者因爲我期望拋出一些頻率,只會從這一個方法(此刻)拋出此異常,並且總是會捕獲此異常,這是一個跡象表明我應該使用其他方法處理這種情況的範例?
是的,絕對。例外情況是出現特殊錯誤,而不是你期望發生的事情。像標準流一樣返回一些狀態碼或狀態聽起來更合適。
異常是由值引發的,而不是通過引用,因此僅僅手頭有一個異常類的實例將無濟於事。
然而,有一種可能性是rethrow_exception
(它需要exception_ptr
作爲參數)可能更有效,與某些給定的編譯器和選擇一些特定的系統上。您將不得不措施來確定這一點。
值得注意的是,對於絕大多數(所有?)C++實現來說,異常機制針對只有極少拋出異常的代碼進行了優化。因此,通過try
塊等執行通常是免費的,免費的。但投擲的行爲可能是昂貴的。所以是的,如果可以的話,不管是什麼任務,都要考慮一些其他「範例」。例如,它可能是你可以返回一個1boost::optional<T>
,這就像一個包含一個對象或沒有任何東西的盒子。
1如果你想避免在加速的依賴那麼Optional
類POD類型是微不足道的實施,以及非POD一個可以利用一個std::vector
爲目標載體,在成本可能的動態分配。
我建議分析和檢查例如在任何激進的優化之前,您的應用程序的內存佔用量/速度。如果使用得當,例外情況會提供更清晰的代碼。當然,在C++中,爲了正確使用異常,您需要使用RAII。此外,您需要了解不同的例外保證,如基本,強大等。 –