关于c ++异常。 func()throw()

时间:2009-03-02 22:39:29

标签: c++ exception throw

我正在阅读此页http://www.cplusplus.com/doc/tutorial/exceptions.html 它说如果我写函数()throw();该函数不能抛出任何异常。我尝试在msvc 2005中编写throw(),throw(int),throw(),什么都没有。每个都有完全相同的结果。没有。我扔了int,char *,另一种类型,它都被捕获了同样的方式。看起来投掷根本不影响它。 function()throw()实际上做了什么?

5 个答案:

答案 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)

抛出规格有两个目的:

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

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

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