我读这个页面 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(),并且您的程序会突然退出。花一些时间,然后去这个

抛出规格有两个目的:

  1. 要作为接口实现和接口用户之间的契约 - 您可以说明可以从您的方法中抛出哪些异常,有些人认为它是接口的一部分。 (合同)Ala检查Java中的异常。

  2. 作为一种向编译器发出信号的方式,它可以应用某些优化,以防从方法/过程中抛出异常(设置异常处理成本)

  3. 抛出未在throw()子句中指定的异常是一个错误,但绝不是为您验证它所需的实现。事实上它甚至不可能验证,因为它包含子程序调用的子程序的所有可能的异常。 (可能来自其他模块)在单个模块中甚至不可能,因为很容易减少到暂停问题:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top