簡體   English   中英

C ++異常規范替換

[英]C++ exception specification replacement

經過一些閱讀后,我意識到,在C ++中,異常規范被認為是一件壞事:

int f() throw(A, B);  // bad because a lot of reasons

(一些參考: 12 ,等)

我還沒有理解的是如何更換它。 我如何告訴f()的調用者他必須捕獲異常?

怎么樣

 //throws: A if something is wrong
 //        B if something else is wrong
 int f();

你沒有。 沒有說什么意味着它可以拋出任何東西。

我假設你有一些Java背景來問這個問題。 編譯時異常檢查是一個失敗的Java實驗。 這就是為什么你在其他任何地方都看不到的原因。

異常處理的一般規則是:盡可能處理它。 這通常歸結為一個非常高級別的try-catch ,在那里你基本上告訴用戶他想要做的任何事情都失敗了。 能夠從異常中恢復並繼續操作是非常罕見的。

當然,您應該提供文檔中函數拋出的異常。 我不認為這是throw規范的替代品(其目的非常不同)。 您應該記錄函數拋出的異常, 並且可以由調用者有意義地處理 ,而throw規范必須列出可能來自此函數的任何異常(以及它調用的函數)。

您可以使用自動文檔工具替換它。

這些工具通常能夠很好地格式化方法將拋出的異常,例如doxygen \\ exception命令(或\\ throw或\\ throws)。 假設您的代碼用戶閱讀文檔,他們將能夠找出要捕獲的異常。

/** 
 * @exception A 
 * @exception B
 */
int f();

有關更多有用信息,請參閱此問題: 如何記錄函數可能拋出的所有異常?

我如何告訴f()的調用者他必須捕獲異常?

您認為調用者必須捕獲異常表示您的設計可能存在問題。 您是否使用例外來表示非特殊情況,例如文件結尾?

要求直接調用者捕獲所有可能的異常是糟糕的設計。 示例:標准庫容器的push_back成員函數分配內存,這可能會失敗。 庫的設計者不希望調用者將每個push_back包裝在try/catch塊中。 這沒有意義。 這樣做會使代碼更加丑陋,更難以測試。 此外,你將如何從內存不足狀態恢復? 在高層次上處理這個問題就是你所能做的一切。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM