关于例外的问题

时间:2010-09-30 07:49:41

标签: c++ exception-handling

我只是在视觉工作室中使用异常并且使用上面的代码我期待,因为我的异常规范没有提到任何应该抛出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;
}

2 个答案:

答案 0 :(得分:6)

关于异常规范,Visual Studio不符合标准。

虽然空异常规范有些用处(但如上所述,VS没有正确实现),一般情况下异常规范被视为an experiment that failed

答案 1 :(得分:1)

基本上,异常规范几乎无用,并且在许多编译器中实现的与标准所声明的不同。查看编译器文档以获取更多信息。

http://msdn.microsoft.com/en-us/library/wfa0edys(VS.80).aspx

我可以想象,这尤其意味着VS编译器将使用异常规范来避免生成堆栈展开所需的代码,并且在实际抛出异常的情况下,最终会出现未定义的行为。