5

在 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

4 回答 4

7

我只会在以下两种情况之一中子类化标准异常类:

  1. 没有一个标准异常类具有描述我的异常性质的名称
  2. 我的异常需要比标准异常(即描述错误的字符串)中找到的更多信息。

否则,没有多大意义。特别是如果其他人必须与您的代码交互并想知道为什么有一个自定义异常类不做任何标准异常不做的事情。

于 2012-04-26T15:40:14.950 回答
1

始终考虑从继承 std::runtime_error 中获得什么。它是否让您更容易处理错误?在示例代码中,它没有带来任何好处,所以如果它所做的一切都是一样的,那么从 std::runtime_error 继承是没有意义的。如果您想添加比 std::runtime_error 更多的信息,那么您可能需要继承这些信息并将其添加到您的错误类中。

于 2012-04-26T15:37:57.570 回答
1

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

我也会读这个:

区别:std::runtime_error 与 std::exception()

于 2012-04-26T15:42:06.687 回答
1

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

于 2012-04-26T17:03:33.987 回答