[英]C++ exception specification replacement
怎么樣
//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.