簡體   English   中英

定義自己的異常類的最佳實踐?

[英]Best practices for defining your own exception classes?

我有一些特殊的異常情況,我想拋出並捕獲,所以我想定義自己的異常類。

有什么最好的做法? 我應該繼承std::exception還是std::runtime_error

是的,最好從std::runtime_error其他標准異常類 繼承 ,如std::logic_errorstd::invalid_argument等,具體取決於它是什么類型的異常。

如果所有異常都從std::exception exception繼承某種方式,那么很容易通過catch(const std::exception &e) {...}捕獲所有常見錯誤。 如果你有幾個獨立的層次結構,這會變得更加復雜。 從專門的異常類派生會使這些異常帶來更多信息,但這實際上有多么有用取決於您如何進行異常處理。

我不是C ++開發人員,但我們在C#代碼中做的一件事是為我們的框架創建一個基類異常,然后記錄構造函數中拋出的異常:

  public FrameworkException(string message, Exception innerException)
      : base(message, innerException)
  {
      log.Error(message, innerException);
  }

  ...

任何派生異常只需調用它的基本構造函數,我們就可以獲得一致的異常日志記錄。 沒什么大不了的,但很有用。

在某些范圍內放置異常時,這是一件好事。 例如,類操作可以在異常類Error中聲明。

並抓住他們

catch ( const Manipulation::InputError& error )
catch ( const Manipulation::CalculationError& error )

在這種情況下,它們可以只是空類而沒有任何其他錯誤信息,除非您設計允許這些異常在您捕獲所有標准異常時飛得更高。

在我看來,如果你繼承std :: exception並不重要。 對我來說,定義異常最重要的是:

  1. 使異常類名稱有用且清晰。
  2. 當函數或類方法拋出異常時,清楚地記錄(寫注釋)。 在我看來,這是異常處理中最大的失敗點。

它沒有太大的區別,因為std::runtime_error也繼承自std::exception 您可能會爭辯說運行時錯誤會傳達有關異常的更多信息,但實際上,人們通常只是從基類異常類派生而來。

暫無
暫無

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

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