c++ - 区别:std::runtime_error 与 std::exception()

标签 c++ exception-handling

std::runtime_errorstd::exception 有什么区别?每个的适当用途是什么?为什么它们首先不同?

最佳答案

std::exception 是唯一目的是作为异常层次结构中的基类的类。它没有其他用途。换句话说,从概念上讲,它是一个抽象类(尽管它在 C++ 术语的含义中没有被定义为抽象类)。

std::runtime_error 是一个更专业的类,源自std::exception,旨在在各种runtime 的情况下抛出错误。它有双重目的。它可以自己抛出,也可以作为各种更专业类型的运行时错误异常的基类,例如 std::range_errorstd::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/

相关文章:

c++ - gcc是否在带/不带大括号的单行中发出不同的输出

c++ - (c++) 将随机值从 main 保存到函数数组

python - 如何安全地确定捕获到的异常的原因?

java - e.printStackTrace 和 System.out.println(e) 的区别

c# - 当 .NET 线程抛出异常时会发生什么?

c++ - 声明 std::map 常量

c++ - 迭代并从 std::map 中删除某些元素时出现段错误?

c++ - AVG 防病毒软件禁用了网络摄像头

java - 当程序需要整数时用户输入字符串时如何防止程序终止?

c++ - 在C++中,异常/错误是否也设置错误号?