C++ 异常处理(限制异常)

C++ 异常处理(限制异常),c++,exception-handling,C++,Exception Handling,我正在处理下面的代码,&弄糊涂了,请看一下 #include<iostream> #include<conio.h> #include<string.h> using namespace std; void Xhandler(int test) throw(char,double) /*i am restricting an integer exception here by not including it in the argument li

我正在处理下面的代码,&弄糊涂了,请看一下

#include<iostream>
#include<conio.h>
#include<string.h>

using namespace std;

void Xhandler(int test) throw(char,double)  /*i am restricting an integer exception     here by not including it in the argument list of throw*/
{
if(test==0) throw test;
if(test==1) throw 'a';
if(test==2) throw 123.23;
}

int main()
{
cout<"start";

try{
    Xhandler(0);  
}

catch(int i)  /*this catch statement must be ignored then,but it is running*/
{
    cout<<"caught an integer"; /*this is the output on the screen*/
}
catch(char c)
{
    cout<<"caught character";
}
catch(double a)
{
    cout<<"caught double";
}

cout<<"end";
    _getch();
    return 0;

     }
#包括
#包括
#包括
使用名称空间std;
void Xhandler(int test)throw(char,double)/*我在这里限制一个整数异常,不将它包含在throw的参数列表中*/
{
如果(测试==0)抛出测试;
如果(测试==1)抛出'a';
如果(测试==2)抛出123.23;
}
int main()
{

CUT< P>你没有指定编译器。如果你使用微软Visual C++,MSDN

上有一个注释

VisualC++在执行异常规范时脱离ANSI标准。下表总结了异常规范的VisualC++实现:

抛出(type)-函数可以抛出类型类型的异常。但是,在VisualC++中,这被解释为抛出(…).< 使用g++时,由于运行示例时出现意外异常,进程将终止。

那么,原因是

catch(int i)  /*this catch statement must be ignored then,but it is running*/
{
    cout<<"caught an integer"; /*this is the output on the screen*/
}
catch(int i)/*此时必须忽略此catch语句,但它正在运行*/
{

cout您的
Xhandler
例程在声明不会引发
int
异常后,会引发
int
异常。这是未定义的,因此可能会发生任何情况。

此行为的原因如下: 如果抛出的异常在
type
指定的异常类型列表中不匹配,则调用
std::unexpected()
。这将根据异常类型列表中是否包含
std::bad_异常进一步抛出相应的异常类型

以下是从C++11标准草案(文件编号:N3337)中摘录的内容:(虽然标准草案不是最终标准,但它在这里起作用)

15.4异常规范[9]
每当抛出异常并且对处理程序(15.3)的搜索遇到异常规范为不允许异常的函数的最外层块时, -如果
异常规范
动态异常规范
,则调用函数
std::unexpected()
(15.5.2), -否则,将调用函数
std::terminate()
(15.5.1)

[示例:
void f()抛出(X,Y){
int n=0;
如果(n)抛出X();//确定
如果(n)抛出Z();//也可以
throw();//将调用std::unexpected()
}
-结束示例]

以下摘录定义了
std::unexpected()
函数的行为:

15.5.2
std::unexpected()
函数
std::unexpected()
函数不应返回,但它可以抛出(或重新抛出)异常。如果它抛出一个新的异常,而该异常是先前被违反的异常规范所允许的,则在调用其异常规范被违反的函数时,将继续搜索另一个处理程序。如果它抛出或重新抛出一个异常,而
动态异常规范
不允许所有异常接下来会发生以下情况:如果
动态异常规范
不包括类
std::bad_u2;-exception
(18.8.2),则函数
std::terminate()调用
,否则抛出的异常将被类型为
std::bad_exception
的实现定义对象替换,并且在违反
动态异常规范
的函数调用时,将继续搜索另一个处理程序。因此,
动态异常规范
保证仅抛出列出的异常。如果
动态异常规范
包含类型
std::bad_exception
,则任何不在列表中的异常都可以替换为函数
std::bad_exception
中的
std::unexpected()


你知道微软为什么会这样偏离C++的标准吗?因此,根据这个规范,我不能控制C++中的函数抛出的异常……???@?不推荐使用指定,并添加noexcept而不是throw()@艾尔弗雷德诺贝尔:对,根据VisualC++实现和标准之间的差异,您不能通过VisualC++中的异常来控制抛出的异常类型。是否有关于SETIONDESTATE的规范?因为它们不适合我,因为我想改变终端()的工作。函数,&它不工作..:p