动态异常规范在c ++ 17中是否无效?

msc*_*msc 2 c++ exception c++17

动态异常规范在c ++ 17中是否无效?像这样

void f() throw(int);
Run Code Online (Sandbox Code Playgroud)

Mar*_*k R 7

一般C++指南不鼓励在任何版本的C++中使用异常规范,新标准已删除此功能.

E.30:不要使用例外规范

原因

异常规范使错误处理变得脆弱,增加了运行时成本,并且已从C++标准中删除.

int use(int arg)
    throw(X, Y)
{
    // ...
    auto x = f(arg);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果f()抛出不同的异常XY意外处理程序被调用,默认情况下终止.这没关系,但是说我们已经检查过这种情况不会发生并且f被改为抛出新的异常Z,除非我们改变use()(并重新测试所有内容),否则我们现在会崩溃.问题在于,f()可能是在图书馆,我们不控制和新的异常没有什么是use()可以做任何事情或以任何方式感兴趣,我们可以改变use()Z过,但现在use()可能需要修改的呼叫者.这很快变得无法管理.或者,我们可以添加一个try- catchuse()映射Z到一个可接受的例外.这也很快变得无法管理.请注意,对异常集的更改通常发生在系统的最低级别(例如,由于网络库或某些中间件的更改),因此更改通过长调用链"冒泡".在大型代码库中,这可能意味着在修改最后一个用户之前,没有人可以更新到新版本的库.如果use()是库的一部分,则可能无法更新它,因为更改可能会影响未知客户端.

多年来,让异常传播直到它们达到可能处理它的功能的策略已经证明了这一点.

注意

不会.如果异常规范被静态执行,这将不会更好.例如,请参阅Stroustrup94.

注意

如果没有抛出异常,请使用 noexcept 或等效throw().

  • 一个名叫Bjarne的家伙我在提出动态异常时看到了问题.他在一次电话交谈中告诉我,一个他没有说出名字的"大玩家"拒绝支持新标准,除非他们被包括在内. (2认同)