可能重复:
Is there a generally accepted idiom for indicating C++ code can throw exceptions?
如何在代码中指出C ++函数是否可以抛出某些内容?我不是指通过文档,而是通过语法。
例如,我尝试在函数声明的末尾放置一个throw(std::exception)
,但是这给了我一个警告说“C ++异常规范被忽略,除了表示函数不是__declspec(nothrow)”,我猜测意味着编译器忽略了throw
并继续进行,好像它不存在一样。
我还尝试在声明的末尾添加throw()
(在括号中没有任何内容),但是 - 与我的期望相反 - 这意味着函数预计永远不会抛出任何东西:“函数假定不会抛出一个例外但是“。
Atm我正在使用throw(...)
语法表明函数可能会抛出,因为这不会给我任何错误或警告。关于如何通过语法表明这一点,您还有其他建议吗?
答案 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
个关键字。