簡體   English   中英

確保異常總是被捕獲

[英]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.

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