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()
(括号中没有任何内容),但与我的预期相反,这意味着该函数永远不会抛出任何内容:“函数假定不会抛出异常,但会抛出异常”
我正在使用Atmthrow(…)
语法指示函数可能会抛出,因为这不会给我任何错误或警告。关于如何通过语法来表示这一点,您还有其他建议吗?您没有。异常说明符并不意味着“这是我可以抛出的”,它们的意思是“如果抛出了除此之外的任何内容,请转到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++不实现异常规范。