在C ++中正确使用异常

时间:2012-04-26 15:32:46

标签: c++ exception coding-style exception-handling runtime-error

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

哪个被认为是更好地使用异常处理/如果更好的做法?

4 个答案:

答案 0 :(得分:7)

我只会在两种情况之一中继承标准异常类:

  1. 没有一个标准异常类具有描述我的异常性质的名称
  2. 我的异常需要额外的信息,而不是标准异常中的内容(即描述错误的字符串)。
  3. 否则,没有多大意义。特别是如果其他人必须与您的代码进行交互并想知道为什么有一个自定义异常类不执行任何操作,标准异常就不会。

答案 1 :(得分:1)

始终考虑从继承std :: runtime_error中获得的收益。它是否让您更容易处理错误?在示例代码中它没有给出任何好处,所以如果它只是相同的事情,那么从std :: runtime_error继承是没有意义的。如果要添加比std :: runtime_error更多的信息,那么您可能希望继承并将其添加到错误类中。

答案 2 :(得分:1)

这取决于项目的规模。如果你正在处理一些小而且需要快速和脏的东西,std:runtime_error就可以了。但是如果您正在开展一个大项目,那么您将需要创建自己的自定义异常来帮助管理(通过捕获)所有不同的可能性。否则现在如果你做了一个捕获,你会抓住一切,如果你需要用不同的方法来处理它们,这可能是一个问题。

我也会读到这个:

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

答案 3 :(得分:1)

我会在你给出的例子中为你的invalid_input类继承std :: exception()。通常,用户输入错误不被视为运行时错误,您可能希望更早地捕获它,您可能希望在它发生时执行不同的逻辑。在大多数情况下,在这种情况下使用或子类化来自runtime_exception会失败“是一个”测试。