4

在C++中的我應該用std::runtime_error來表示某種錯誤發生,或者我應該創建一個從std::runtime_error繼承,所以我可以更好地處理這些自定義異常。恰當使用C++異常

例如,如果我從不知何故用戶的輸入,這將是更好:

if (inputInvalid) 
{ 
    throw std::runtime_error("Invalid input!"); 
} 

對戰...

class invalid_input 
    : public std::runtime_error /* or should I inherit from std::exception? */ 
{ 
public: 
    invalid_input() 
     : std::runtime_error("Invalid input!") 
    { 
    }; 
}; 

------------------------------------------------------- 

if (inputInvalid) 
{ 
    throw invalid_input(); 
} 

這被認爲是更好的使用異常處理/如果這更好的實踐?

+0

後者將使捕獲這種特定類型的運行時錯誤成爲可能,而第一種只允許您捕獲'a'運行時錯誤。哪個更好取決於你打算如何處理錯誤。 – wroniasty 2012-04-26 15:39:03

+0

這是一個非常敏感的話題,每個人都有不同的意見。只要看看'Go'式的方法('throw'終止任務,所以不需要有明顯的類型)與'Java'方法及其非常複雜的層次結構。 – 2012-04-26 15:39:54

回答

6

我只能繼承一個標準的異常類在兩種情況之一:

  1. 標準異常類都沒有描述我的異常的性質名
  2. 我例外,需要比什麼都可以附加信息在標準異常中找到(即描述錯誤的字符串)。

否則,沒有多少意義。特別是如果其他人將不得不與你的代碼進行交互,並想知道爲什麼有一個自定義的異常類沒有做任何事情,一個標準的異常不會做。

1

總是想着從繼承std :: runtime_error中獲得什麼。它是否讓您更輕鬆地處理錯誤?在示例代碼中,它沒有給出任何好處,所以如果它從一個方面繼承std :: runtime_error,那麼沒有任何意義。如果你想添加比std :: runtime_error更多的信息,那麼你可能想要繼承並將它們添加到你的錯誤類中。

1

這將取決於項目的規模。如果你在小事上工作,只需要快速和骯髒的東西,std:runtime_error就沒問題。但是,如果你在一個大項目上工作,你將要創建自己的自定義例外,以幫助管理(通過捕獲)所有不同的可能性。否則,現在如果你做了一個捕獲,你會捕獲一切,如果你需要以不同的方式捕捉多個不同的東西來處理它們,這可能是一個問題。

我也會這樣說的:

Difference: std::runtime_error vs std::exception()

0

我將繼承的std ::例外()在你給的例子你INVALID_INPUT類。通常情況下,用戶輸入錯誤不被視爲運行時錯誤,您可能希望儘早捕獲它,您可能希望在發生時執行不同的邏輯。在這種情況下,從runtime_exception中使用或繼承大多數情況下會失敗「是」測試。