2016-02-01 103 views
1

我在幾處提到異常情況可能很貴的地方看過。我有一個例外,我預計會發生一些頻率,我會每次都抓住它。這可能是一個天真的問題(像許多人,我遲到異常遊戲):我可以有一個異常的靜態全局實例嗎?

我可以創建一個靜態的全局實例我的異常和throw它出現時(只有一種方法),捕捉它每一次?

這會讓我什麼時候都省心嗎?或者因爲我期望拋出一些頻率,只會從這一個方法(目前)拋出這個異常,並且總會捕獲這個異常,這是否表明我應該使用其他一些範式來處理這種情況?

感謝您的任何有幫助的答案!

+0

我建議分析和檢查例如在任何激進的優化之前,您的應用程序的內存佔用量/速度。如果使用得當,例外情況會提供更清晰的代碼。當然,在C++中,爲了正確使用異常,您需要使用RAII。此外,您需要了解不同的例外保證,如基本,強大等。 –

回答

3

首先回答你的真正問題:

我可以創建例外的靜態全局實例,並把它當它出現(只能從一個方法),每次抓呢?

不是。拋出的異常對象總是新構造的,它每次都是唯一的對象。而且,異常對象的構建並不昂貴,異常控制流程也是如此。但

或者因爲我期望拋出一些頻率,只會從這一個方法(此刻)拋出此異常,並且總是會捕獲此異常,這是一個跡象表明我應該使用其他方法處理這種情況的範例?

是的,絕對。例外情況是出現特殊錯誤,而不是你期望發生的事情。像標準流一樣返回一些狀態碼或狀態聽起來更合適。

4

異常是由值引發的,而不是通過引用,因此僅僅手頭有一個異常類的實例將無濟於事。

然而,有一種可能性rethrow_exception(它需要exception_ptr作爲參數)可能更有效,與某些給定的編譯器和選擇一些特定的系統上。您將不得不措施來確定這一點。

值得注意的是,對於絕大多數(所有?)C++實現來說,異常機制針對只有極少拋出異常的代碼進行了優化。因此,通過try塊等執行通常是免費的,免費的。但投擲的行爲可能是昂貴的。所以是的,如果可以的話,不管是什麼任務,都要考慮一些其他「範例」。例如,它可能是你可以返回一個1boost::optional<T>,這就像一個包含一個對象或沒有任何東西的盒子。


1如果你想避免在加速的依賴那麼Optional類POD類型是微不足道的實施,以及非POD一個可以利用一個std::vector爲目標載體,在成本可能的動態分配。

+0

謝謝!該方法實際上目前沒有任何回報,並且我可以很容易地讓它返回一個表示它已經成功與否的布爾值。我想在移動時更喜歡對返回的狀態代碼進行異常處理,但我有點太熱情了。 – DanielGr

+0

(返回void,即返回。) – DanielGr

相關問題