c++ - 为什么在编译时不检查 C++ 异常规范?

标签 c++ exception c++11 exception-specification

我刚刚读到,在 C++11 标准修订版中,不推荐使用异常规范。我之前认为指定您的函数可能抛出的内容是一种很好的做法,但显然并非如此。

看完Herb Stutter's well-cited article ,我不禁想知道:到底为什么异常规范会按照它们的方式实现,为什么委员会决定弃用它们而不是在编译时检查它们?为什么编译器甚至允许抛出函数定义中没有出现的异常?对我来说,这听起来像是在说“你可能不应该指定你的函数返回类型,因为当你指定 int f() 时,但是 return 3.5; 在它里面,你的程序可能会崩溃。” (即,概念上与强类型的区别在哪里?)

(由于 typedef 中缺少异常规范支持,考虑到模板语法可能是图灵完备的,实现它听起来很容易。)

最佳答案

最初的原因是认为不可能 可靠地检查现有代码的主体,以及事实 没有说明符意味着任何东西都可以抛出。意思就是 如果静态检查生效,则以下代码不会 编译:

double
safeSquareRoot( double d ) throw()
{
    return d > 0.0 ? sqrt( d ) : 0.0;
}

此外,异常的目的是报告错误 很远,这意味着中间函数 不应该知道他们调用的函数可能会抛出什么。 要求对它们使用异常说明符会中断 封装。

函数需要了解的唯一真实情况 可能发生的异常是要知道什么异常不能 发生。特别是,不可能写出线程安全的代码 除非你能保证某些功能永远不会 扔。即使在这里,静态检查也是 Not Acceptable ,因为 上面解释的原因,所以异常规范是 旨在更像是一个你不能的断言 disactivate:当你写 throw() 时,你或多或少会得到 如果函数终止,则相当于断言失败 一个异常(exception)。

Java 中的情况有些不同。在 java , 没有真正的输出参数,这意味着如果你不能 如果函数也有返回值,则使用返回码。这 结果是在很多情况下使用异常 返回代码将是可取的。而这些,你必须 了解并立即处理。对于应该做的事 确实是异常,Java 有 java.lang.RuntimeException (未静态或以其他方式检查)。它没有 表示函数永远不会抛出异常的方式;它 在以下情况下也使用未经检查的异常(称为 Error) 中止程序会更合适。

关于c++ - 为什么在编译时不检查 C++ 异常规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471647/

相关文章:

c++ - 自定义小部件上 float 类型的 Q_PROPERTY 未出现在属性编辑器中

android - 滑动时 ViewPager 更新 fragment

python - 我应该在尝试/异常(exception)之后使用finally吗?

c++ - 对于双映射

c++ - 在运行时检测负载是否是原子的?

c++ - 迭代基本类型时使用 const 引用有什么缺点吗?

c++ - stringstream 的模糊重载

c++ - switch 语句中的静态变量

ruby - 在 ruby​​ 中捕获 Ctrl-c

c++ - 如何通过STL算法获得两个数组( vector )的组合?