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

C++ C++;:指示函数可能会抛出,c++,exception,syntax,coding-style,C++,Exception,Syntax,Coding Style,可能重复: 你在代码中如何指出C++函数有可能抛出什么东西?我的意思不是通过文档,而是通过语法 例如,我尝试在函数声明的末尾放置一个抛出(std::exception),但这给了我一个警告,说“C++异常规范被忽略,只是为了表明函数不是u declspec(nothrow)”,我想这意味着编译器忽略了抛出,并继续进行,就好像它不在那里一样 我还尝试在声明末尾添加一个throw()(括号中没有任何内容),但与我的预期相反,这意味着该函数永远不会抛出任何内容:“函数假定不会抛出异常,但会抛出异常”

可能重复:

<>你在代码中如何指出C++函数有可能抛出什么东西?我的意思不是通过文档,而是通过语法

例如,我尝试在函数声明的末尾放置一个
抛出(std::exception)
,但这给了我一个警告,说“C++异常规范被忽略,只是为了表明函数不是u declspec(nothrow)”,我想这意味着编译器忽略了
抛出,并继续进行,就好像它不在那里一样

我还尝试在声明末尾添加一个
throw()
(括号中没有任何内容),但与我的预期相反,这意味着该函数永远不会抛出任何内容:“函数假定不会抛出异常,但会抛出异常”


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

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


< C++的语义是,你必须假定函数总是可以抛出。

< P>当异常规范时,大多数编译器都不符合标准。异常规范被视为一种异常规范 例如:
如果您有一个空白的异常规范,那么会调用什么?将抛出
unexpected()
方法或
bad\u异常
,如果两者都是,则按什么顺序抛出

 #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;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
甲级
{
公众:
int i;
};
无效()
{

cerr基本上,
throw
说明符一文不值,不幸的是,在引入它们之后我们发现了这一点,而当前的编译器忽略了它们。它们已经被弃用了,高质量的库也没有包含它们。只是不用麻烦了。C++0x正式弃用了它们,并且只有一个
noexcept
关键字。

不,在dy的情况下namic异常规范它将转到
std::unexpected
,而不是
std::terminate
@Karl:我没有给出技术上的答案——语义不一定是标准所说的。unexpected的默认行为是调用terminate或abort(不记得确切是哪个)对大多数用户来说,这意味着同样的事情。这里的要点是运行时检查,而不是编译时检查。我知道它是运行时,但我正在寻找一种快速指示函数可以抛出的方法。即使C++允许所有的东西都抛出,除非另有说明,但事实是大多数时间函数都不会抛出。is意味着当它们抛出时,应该让它们脱颖而出。@Paul:以我的经验,大多数函数都会抛出。至少,
std::bad_alloc
@Paul:一个调用抛出函数的函数也会抛出,除非它捕捉到这些异常。大多数时候,某个地方的某个人正在调用
std::basic_string::append
(或
操作符+=
等效)、
std::vector::push_back
,或类似的东西。除了空的(
throw()
/
nothrow
)之外,VC++不实现异常规范。