std::runtime_error
和 std::exception
有什么区别?每个的适当用途是什么?为什么它们首先不同?
最佳答案
std::exception
是唯一目的是作为异常层次结构中的基类的类。它没有其他用途。换句话说,从概念上讲,它是一个抽象类(尽管它在 C++ 术语的含义中没有被定义为抽象类)。
std::runtime_error
是一个更专业的类,源自std::exception
,旨在在各种runtime 的情况下抛出错误。它有双重目的。它可以自己抛出,也可以作为各种更专业类型的运行时错误异常的基类,例如 std::range_error
、std::overflow_error
等等。您可以定义自己的从 std::runtime_error
降序的异常类,也可以定义自己的从 std::exception
降序的异常类。
就像 std::runtime_error
一样,标准库包含 std::logic_error
,也是从 std::exception
下降而来的。
拥有这种层次结构的目的是让用户有机会使用 C++ 异常处理机制的全部功能。由于“catch”子句可以捕获多态异常,因此用户可以编写“catch”子句来从异常层次结构的特定子树中捕获异常类型。例如,catch (std::runtime_error& e)
将捕获来自 std::runtime_error
子树的所有异常,让所有其他异常通过(并在调用堆栈中飞得更远) )。
附:设计一个有用的异常类层次结构(让您在代码的每个点只捕获您感兴趣的异常类型)是一项非常重要的任务。您在标准 C++ 库中看到的是一种可能的方法,由该语言的作者提供给您。如您所见,他们决定将所有异常类型拆分为“运行时错误”和“逻辑错误”,并让您从那里继续使用自己的异常类型。当然,还有其他方法来构建该层次结构,这可能更适合您的设计。
更新:Linux 与 Windows 的可移植性
正如 Loki Astari 和 unixman83 在下面的回答和评论中指出的那样,exception
类的构造函数根据 C++ 标准不接受任何参数。 Microsoft C++ 有一个在 exception
类中接受参数的构造函数,但这不是标准的。 runtime_error
类在 Windows 和 Linux 两个平台上都有一个带参数 (char*
) 的构造函数。为了便于移植,最好使用 runtime_error
。
(请记住,仅仅因为您的项目规范表明您的代码不必在 Linux 上运行,并不意味着它永远不必在 Linux 上运行。)
关于c++ - 区别:std::runtime_error 与 std::exception(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569726/