题
我读这个页面 http://www.cplusplus.com/doc/tutorial/exceptions.html 它说如果我写的功能()扔();没有例外可以被扔在这一职能。我试图在msvc2005年编写扔(),扔(int),扔()并什么都没有。每个人都有完全相同的结果。什么都没有。我扔int,char*,另一类型,它是所有陷入相同的方式。它看起来像扔不影响它在所有。什么是功能()扔()实际上做什么?
解决方案
有关C ++异常规范和Microsoft实现的详细信息,请参阅本文: / p>
Microsoft Visual C ++ 7.1会忽略异常规范,除非它们为空。空异常规范等同于
__ declspec(nothrow)
,它们可以帮助编译器减少代码大小。[...]如果它看到一个空的异常规范,它会假设你知道你在做什么,并优化掉处理异常的机制。如果你的功能无论如何都会抛出 - 好吧,羞辱你。只有当你100%肯定你的功能没有投掷时才使用此功能。
其他提示
您所发现的是该版本的VC ++没有强制执行规范异常。我认为这被记录为与标准的差异。
但是,异常规范通常不是一个好主意。如果一个程序在符合标准的实现中违反它们(在这种情况下,VS 2005中的VC ++不是这样),系统应该捕获它。这意味着规范不是编译器优化提示,而是强制编译器使用额外的长度,有时会产生次优代码。
请参阅 Boost理由,了解备受推崇的Boost原因项目不使用异常规范。这是Boost,它是用语言的高级部分做奇怪和有用的事情的典型代表。
引述 一个务实的看看规格异常:
(Mis)的谅解
第二个问题已经做 知道你在说什么。作为许多 着名人士,包括作者 升例外说明书 理由,已经把它, 程序员倾向于使用例外 规范的,虽然他们的表现 该方法的程序员会一样, 而不是他们实际上做 行为。
这是什么很多人认为 例外规格:
保证的功能将仅扔列出的例外情况(可能 无)。
使编译器优化基于知识,只有列出 例外情况(可能无)将 抛出。
上述期望是,再说一次, 看似接近于被正确的。
看到链接的全部细节。
抛出异常是不够的,你需要一个 try {} catch()
块来捕获异常。如果没有捕获异常,则会调用 std :: terminate()
,并且您的程序会突然退出。花一些时间,然后去这个。
-
要作为接口实现和接口用户之间的契约 - 您可以说明可以从您的方法中抛出哪些异常,有些人认为它是接口的一部分。 (合同)Ala检查Java中的异常。
-
作为一种向编译器发出信号的方式,它可以应用某些优化,以防从方法/过程中抛出异常(设置异常处理成本)
醇>
抛出未在throw()子句中指定的异常是一个错误,但绝不是为您验证它所需的实现。事实上它甚至不可能验证,因为它包含子程序调用的子程序的所有可能的异常。 (可能来自其他模块)在单个模块中甚至不可能,因为很容易减少到暂停问题:)