簡體   English   中英

在C ++中正確使用異常

[英]Proper use of exceptions in C++

在C ++中我應該使用std::runtime_error來指示發生了某種錯誤,或者我應該創建從std::runtime_error繼承的自定義異常,以便我可以更好地處理它們。

例如,如果我以某種方式從用戶那里獲得了輸入,那會更好:

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();
}

哪個被認為是更好地使用異常處理/如果更好的做法?

我只會在以下兩種情況之一中對一個標准異常類進行子類化:

  1. 沒有標准異常類具有描述我的異常性質的名稱
  2. 我的異常需要額外的信息,而不是標准異常中可以找到的信息(即描述錯誤的字符串)。

否則,沒有多大意義。 特別是如果其他人必須與您的代碼交互並想知道為什么有一個自定義異常類不執行任何操作,標准異常就不會。

總是想想你從繼承std :: runtime_error中獲得了什么。 它是否讓您更容易處理錯誤? 在示例代碼中它沒有給出任何好處,所以如果它只是相同的事情,那么從std :: runtime_error繼承是沒有意義的。 如果要添加比std :: runtime_error更多的信息,那么您可能希望繼承並將其添加到錯誤類中。

這取決於項目的規模。 如果你正在處理一些小而且需要快速和臟的東西,std:runtime_error就可以了。 但是如果您正在開展一個大項目,那么您將需要創建自己的自定義異常來幫助管理(通過捕獲)所有不同的可能性。 否則現在如果你做了一個捕獲,你會抓住一切,如果你需要以不同的方式處理多個不同的東西來處理它們,這可能是一個問題。

我也會讀到這個:

區別:std :: runtime_error vs std :: exception()

我會在你給出的例子中為你的invalid_input類繼承std :: exception()。 通常,用戶輸入錯誤不被視為運行時錯誤,您可能希望更早地捕獲它,您可能希望在它發生時執行不同的邏輯。 在大多數情況下,在這種情況下使用或子類化來自runtime_exception會失敗“是一個”測試。

暫無
暫無

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

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