我刚刚读到,在 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/