C++ 异常处理

C++ 异常处理,c++,C++,然后程序终止了 但是当我写的时候,我没有想到 terminate disabled 输出是 #include <iostream> using namespace std; #include <exception> void dis() { cout<<"terminate disabled "<< endl; } void display() throw(int,double) { if(0)

然后程序终止了

但是当我写的时候,我没有想到

terminate disabled
输出是

#include <iostream>  
using namespace std;  
#include <exception>  

void dis()
{
    cout<<"terminate disabled "<< endl;
}

void display() throw(int,double)    
{
    if(0)  
        throw int();  
    if(0)  
        throw double();  
    if(1)  
        throw string();  
}  

int main()  
{     
    set_unexpected(dis);  
    try  
    {  
        display();      
    }  
    catch(int)  
    {
        cout<<"int "<< endl;
    }  
    catch(double)  
    {
        cout<<"double "<< endl;
    }  
    catch(string)  
    {
        cout<<"string "<< endl;
    }  

    system("pause");  
    return 0;  
}      
set_terminate(dis);

为什么要这样做?

所以,还不完全清楚您最初的输出是什么。我试着尽我所能把它清理干净,但是你的报价标签使它不明显

在代码中,如果使用
设置意外(dis)
,您应该看到:

terminate disabled  
terminate disabled 
terminate disabled
terminate disabled
在您的代码中,如果您使用
设置\终止(dis)
,您应该看到:

terminate disabled  
terminate disabled 
terminate disabled
terminate disabled
在代码中,如果同时使用
set\u unexpected(dis)
set\u terminate(dis)
,您应该看到:

terminate disabled  
terminate disabled 
terminate disabled
terminate disabled

解决这个问题的一种方法是让dis
抛出0
作为最后一行。这将允许您将异常转换为您的函数声称将抛出的内容。

您不应在
下面使用命名空间std语句。@als这是互联网上给出的GCC的Mingw端口。我宁愿去掉异常规范,也不愿找出它们。异常规范可能很难获取和保持正确,模板的工作非常糟糕,类型系统也很复杂,等等。我不明白,在他的代码中,displa()throw string(),在他的main()中,string Exception被捕获,不是吗?为什么会触发dis?@Alcott:他使用了一个。因此,函数应该只返回其中指定的类型。