C ++:指示函数可能会抛出

时间:2011-06-02 15:13:40

标签: c++ exception syntax coding-style

  

可能重复:
  Is there a generally accepted idiom for indicating C++ code can throw exceptions?

如何在代码中指出C ++函数是否可以抛出某些内容?我不是指通过文档,而是通过语法。

例如,我尝试在函数声明的末尾放置一个throw(std::exception),但是这给了我一个警告说“C ++异常规范被忽略,除了表示函数不是__declspec(nothrow)”,我猜测意味着编译器忽略了throw并继续进行,好像它不存在一样。

我还尝试在声明的末尾添加throw()(在括号中没有任何内容),但是 - 与我的期望相反 - 这意味着函数预计永远不会抛出任何东西:“函数假定不会抛出一个例外但是“。

Atm我正在使用throw(...)语法表明函数可能会抛出,因为这不会给我任何错误或警告。关于如何通过语法表明这一点,您还有其他建议吗?

3 个答案:

答案 0 :(得分:5)

你没有。异常说明符并不意味着“这是我可以抛出的东西”,它们的意思是“如果除此之外的任何东西被抛出,请转到std::terminate”。这种行为违反了MSVC ++不支持也不支持它们的观点。

C ++的语义是你必须假设一个函数总能抛出。

答案 1 :(得分:2)

在涉及Exception规范时,大多数编译器都不符合标准。例外规范被视为 experiment that failed.
例如:
如果你有一个空白的异常规范,那么会被调用什么?将抛出unexpected()方法或bad_exception,如果两者都按什么顺序?

 #include "stdafx.h"  
 #include <stdio.h>  
 #include <exception>  
 #include <iostream>  


using namespace std;

class A
{
    public:
        int i;
};

void myunexpected () 
{
    cerr << "unexpected called\n";
}

void doSomething(void) throw();
void doSomething(void) throw()
{
    A obj;
    obj.i= 100;
    throw obj;
}


int _tmain(int argc, _TCHAR* argv[])
{
    set_unexpected (myunexpected);
    try 
    {
        doSomething();
    }
    catch (bad_exception be) 
    {
        puts("Caught something");
    }
    catch (A &obj) 
    {
        puts("Caught Integer");
    }
    return 0;
}

如果在Visual Studio上运行此代码,您将看到异常被相应的处理程序捕获。

总而言之,Exception规范是一个失败的实验,最好避免它们。

答案 2 :(得分:2)

基本上,throw说明符毫无价值,不幸的是,之后发现,并且当前的编译器会忽略它们。它们已被弃用,质量库不包含它们。只是不要打扰他们。 C ++ 0x正式弃用它们,并且只有noexcept个关键字。