首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于C++中的throw()

关于C++中的throw()
EN

Stack Overflow用户
提问于 2010-01-29 04:10:21
回答 4查看 958关注 0票数 2

MyFunction(int i)抛出();

它只是告诉编译器该函数不会抛出任何异常。

它不能确保函数不抛出任何东西,对吗?

那么throw()有什么用呢?

它是多余的吗?为什么要提出这个想法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-29 04:20:26

首先,当编译器工作正常时,它是强制执行的--但在运行时,而不是在编译时。异常规范为空的函数不会抛出异常。如果发生了一些事情,可能会产生一个异常,它会转而调用unexpected(),而后者又会调用abort。您可以使用set_unexpected来更改调用的内容,但是该函数所允许做的就是在中止程序之前添加额外的“东西”(例如清理) --它不能返回到原始的执行路径。

也就是说,至少有一个主要编译器(VC++)解析异常规范,但不强制执行它们,尽管它可以使用空的异常规范来提高一点优化。在这种情况下,未遵循的异常规范可能/确实会导致未定义的行为,而不一定会中止程序。

票数 5
EN

Stack Overflow用户

发布于 2010-01-29 04:15:16

正如您所说的,它只是告诉编译器函数不会抛出任何异常。

当编译器期望可能的异常时,它通常必须以某种特定的形式生成代码,这会降低效率。它可能还必须生成一些额外的“家用”代码,其唯一目的是在抛出异常时处理它们。

当您告诉编译器这个函数从不抛出任何东西时,它使编译器更容易识别出完全不必要的所有这些额外异常相关开销的情况,从而帮助编译器生成更有效的代码。

请注意,如果您在运行时实际尝试从使用throw()规范声明的函数中抛出某些东西,则不允许异常离开该函数。取而代之的是调用所谓的意外异常处理程序,该处理程序默认情况下将终止程序。因此,从这个意义上说,throw()函数实际上是强制不抛出任何东西的。

另外,由于异常规范主要影响程序的运行时行为,通常它们可能不会对编译时产生任何影响。然而,这个特定的异常规范-空的throw() -实际上在编译时被一些编译器识别,并确实导致生成更有效的代码。有些人(包括我)认为空的异常规范是唯一真正值得在实际代码中使用的规范。

票数 1
EN

Stack Overflow用户

发布于 2010-01-29 04:17:01

它不能确保函数没有抛出任何东西,对吗?

你就快到了。它是一个异常规范。这意味着作为实现者,你可以向你的客户保证这段代码不会抛出异常。但是,这并不会阻止MyFunction中的一些函数抛出,如果您不处理它们,这些函数将会冒泡,并导致您/客户机的程序以您不想要的方式出现。这并不意味着您不能在其中包含throw表达式。

最好避免这样的规范,除非您绝对确定您的代码永远不会抛出--这是一种困难,除非是非常基本的函数。参见标准swap、指针赋值等。

它是冗余的吗?为什么要提出这个想法?

不完全同意。如果使用得当,它可以帮助编译器进行优化。请参阅this文章。This的一篇文章很好地解释了非抛出背后的历史。

再深入一点,我发现Boost文档中有一篇很棒的this文章。一本必读的书。阅读有关异常保证部分的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2157606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档