C++怎么对抛出异常的函数使用noexcept

本篇内容主要讲解“C++怎么对抛出异常的函数使用noexcept”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么对抛出异常的函数使用noexcept”吧!

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了泾源免费建站欢迎大家使用!

如果函数不会抛出异常,则声明为noexcept

Reason(原因)

如果经过推断不会抛出异常,程序就不必假设需要处理错误并且尽快终止执行。声明函数为noexcept可以通过减少可能的执行路径的方式帮助优化程序。这样做也会加速失败后的退出处理。

Example(示例)

为完全使用C写成或者不会发生异常的其他语言构成的函数增加noexcept修饰。C++标准库暗中为所有的C标准库函数做了相同的事情。

Note(注意)

constexpr函数在运行时刻可以抛出异常,因此你可以为某些(不是全部)constexpr函数指定noexcept。

译者注:例如被0除。

Example(示例)

你甚至可以对可以抛出异常的函数使用noexcept。

vector collect(istream& is) noexcept{    vector res;    for (string s; is >> s;)        res.push_back(s);    return res;}

如果collect()在运行时耗尽了内存,程序就会崩溃。除非程序经过精心设计可以避免内存耗尽,这可能是可以做的唯一的事情了。terminate()可能生成适当的错误日志信息(但是当内存耗尽时,很难难精巧地完成任何事)

译者注:声明noexcept就是告诉编译器不需要生成捕获和向外传递异常的机制了。如果实际上发生了异常,其结果就如本节所描述。作者这里想说的应该是:错误指定noexcept属性是有风险的。

Note(注意)

当需要决定是否为函数标记noexcept时,必须注意代码执行时所处的执行环境。最重要的原因是关于抛出异常和内存分配的议题。试图被完美地普遍使用的代码(例如标准库或其他类似代码)需要支持bad_loc异常可能被有意义地处理的环境(而不只是简单中止执行,译者注)。然而,大多数程序和执行环境无法有意义地处理分配内存失败,而且在那些情况下,中止程序是申请内存失败最干净和最简单的处理。如果你知道你的应用程序不能处理内存分配错误,哪怕函数包含内存分配动作,为其增加noexcept可能也是适当的。(这样可以触发terminate处理,译者注)

换句话说,大多数程序,大多数函数都会抛出异常(例如,它们可能是使用new,可能会调用可能抛出异常的函数,或者使用了通过抛出异常报告错误的库函数),因此不要在不考虑异常是否会被处理的情况下就到处使用noexcept。

noexcept对于那些经常使用的,低层次的函数特别有用(而且很容易判断正确性)。

Note(注意)

析构函数,交换函数,移动操作和默认构造函数永远不应该抛出异常。

Enforcement(实施建议)

  • Flag functions that are not noexcept, yet cannot throw.

    标记那些没有noexcpet属性但是又不抛出异常的函数。

  • Flag throwing swap, move, destructors, and default constructors.

    标记抛出异常的交换/移动操作,析构函数和默认构造函数。

到此,相信大家对“C++怎么对抛出异常的函数使用noexcept”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享文章:C++怎么对抛出异常的函数使用noexcept
当前URL:http://ybzwz.com/article/gjsgde.html