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