[英]Ensuring that Exceptions are always caught
C++ 中的異常不需要被調用函數捕獲(沒有編譯時錯誤)。 因此,是否使用 try/catch 捕獲它們取決於開發人員的判斷(與 Java 中不同)。
有沒有一種方法可以確保拋出的異常總是被調用函數使用 try/catch 捕獲?
不。
有關原因,請參閱A Pragmatic Look at Exception Specifications 。
您可以“幫助”這個的唯一方法是記錄您的函數可以拋出的異常,比如在聲明它的頭文件中的注釋。 這不是由編譯器或任何東西強制執行的。 為此目的使用代碼審查。
你不應該在這里使用異常。 如果您需要在使用此功能的任何地方都期待它,這顯然不是一個特例!
更好的解決方案是讓函數返回這樣的實例。 在調試版本中(假設開發人員執行他們剛剛編寫的代碼路徑),如果他們忘記檢查操作是否成功,他們將得到一個斷言。
class SearchResult
{
private:
ResultType result_;
bool succeeded_;
bool succeessChecked_;
public:
SearchResult(Result& result, bool succeeded)
: result_(result)
, succeeded_(succeeded)
, successChecked_(false)
{
}
~SearchResult()
{
ASSERT(successChecked_);
}
ResultType& Result() { return result_; }
bool Succeeded() { successChecked_ = true; return succeeded_; }
}
在你的問題范圍之外,所以我爭論不發布這個,但在 Java 中實際上有兩種類型的異常,檢查和未檢查。 基本區別在於,就像在c[++]
,您不必捕獲未經檢查的異常。
作為一個很好的參考試試這個
Chris ' 可能對這個問題有最好的純粹回答:
但是,我對問題的根源很好奇。 如果用戶應該始終將調用包裝在 try/catch 塊中,那么用戶調用的函數是否真的應該首先拋出異常?
如果沒有更多關於相關代碼庫的上下文,這是一個很難回答的問題。 從臀部拍攝,我認為這里的最佳答案是將函數包裝起來,以便推薦的(如果不僅如此,取決於代碼的整體異常樣式)公共接口為用戶執行 try/catch。 如果您只是想確保代碼中沒有未處理的異常,那么單元測試和代碼審查可能是最好的解決方案。
有沒有一種方法可以確保拋出的異常總是被調用函數使用 try/catch 捕獲?
我覺得很有趣,Java 人群 - 包括我自己- 試圖避免檢查異常。 他們正試圖通過使用RuntimeExceptions來解決被迫捕獲異常的問題。
曾經有人嘗試將動態異常規范添加到函數的簽名中,但由於該語言無法確保其准確性,因此后來被貶低。
在 C++11 及以后,我們現在有noexcept 說明符。
同樣,如果簽名被標記為拋出,仍然不需要調用者處理它。
根據上下文,您可以通過將異常行為編碼到類型系統中來確保處理異常行為。
請參閱: std::optional作為庫基礎知識的一部分。
或者你可以開始拋出關鍵異常。 當然,訪問沖突異常會引起你的用戶的注意力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.