请问一下C++的异常处理代码有哪里错误???

2025-05-09 19:09:04
推荐回答(1个)
回答1:

//是你的代码问题:你如果想看看是哪个 catch扑捉到异常,可以改成下面代码
#include
using namespace std;
void f(int &a)
{
try
{
throw a;
}
catch(int &a)
{
a=1;
cout< throw;
}
catch(...)
{
a=2;
cout< }
}
int main()
{
int a=0;
try
{
f(a);
}
catch(...)
{
a=3;
cout< }
return 0;
}
说明:
try之后可以跟任意个catch块. 发生异常后,会生成临时的异常对象,进行一些自动处理之后,程序 流程跳转到后面的catch(),逐个检查这些catch(),如果与catch() 中指定的类型一致,则将对象拷贝给catch参数中的对象, 接着执行该catch块中的代码,然后跳过其他所有剩下的catch, 继续执行后续的代码. 上面所说的自动处理指的是堆栈回退,说白了就是为函数中的局部对象调用析构函数,保证这些局部对象行为良好.
catch()的顺序通常按照:从特殊到一般的顺序: catch(Tsub o){} catch(Tbase o){} catch(...){} 如果第一个catch为catch(Tbase){},则它将捕捉其所有派生类的 异常对象. 如果第一个catch为catch(...){},则其后的所有catch永远不可能 被执行.
重新抛出异常: 从上面的处理机制可以看到,只有一个catch可能被执行, 如果一个catch被执行,其他后续的catch就会被跳过了. 有时候一个catch中可能无法完成异常的全部处理,需要将 异常提交给更高的层,以期望得到处理.重新抛出异常实现 了这种可能性. 语法: throw ; 空的throw语句,只能在atch中使用. 它重新抛出异常对象,其外层的catch可能可以捕捉这个重新抛出的异常并做适当处理.