我只是在视觉工作室中使用异常并且使用上面的代码我期待,因为我的异常规范没有提到任何应该抛出bad_exception的内容。但实际发生的是异常被适当的处理程序捕获。为什么这样?我在IDE中缺少某些设置或其他内容吗?
虽然我在上面提到的卡住了,但实际上我试图找到问题的答案,如果我有一个例外空白规范那么什么叫做? 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;
}
答案 0 :(得分:6)
关于异常规范,Visual Studio不符合标准。
虽然空异常规范有些用处(但如上所述,VS没有正确实现),一般情况下异常规范被视为an experiment that failed。
答案 1 :(得分:1)
基本上,异常规范几乎无用,并且在许多编译器中实现的与标准所声明的不同。查看编译器文档以获取更多信息。
http://msdn.microsoft.com/en-us/library/wfa0edys(VS.80).aspx
我可以想象,这尤其意味着VS编译器将使用异常规范来避免生成堆栈展开所需的代码,并且在实际抛出异常的情况下,最终会出现未定义的行为。