您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记——异常处理匹配与函数嵌套

2018-01-31 16:26 441 查看
问题背景:C++中,使用catch语句来捕获异常,即catch(异常类型),那么在有函数嵌套时,异常类型是如何匹配的呢?

例1:请看如下代码

#include <iostream>

using namespace std;

void f3()
{
double temp = 10;

try
{
throw temp;
}
catch (float)
{
cout << "f3 catch!" << endl;
}

cout << "f3 end!" << endl;
}

void f2()
{
try
{
f3();
}
catch (int)
{
cout << "f2 catch!" << endl;
}

cout << "f2 end!" << endl;
}

void f1()
{
try
{
f2();
}
catch (char)
{
cout << "f1 catch!" << endl;
}

cout << "f1 end!" << endl;
}

int main()
{
try
{
f1();
}
catch (double)
{
cout << "main catch!" << endl;
}

cout << "main end!" << endl;

return 0;
}

运行结果如下:



分析:原始异常来自函数f3,该异常是double类型。根据控制台打印结果,我们可以看到异常直接被主函数捕获,然后代码运行结束。这是因为只有主函数的catch(double)语句与f3中抛出的异常类型相同。函数f3在抛出异常之后,会立刻离开本函数中的try,经本函数中的catch检测不匹配之后,不再继续执行本函数,而是会一层层向上传递,直到异常被传递到主函数,被主函数中的catch(double)捕获,然后顺利执行完主函数。为了验证这一观点,请看例2。

例2:我们仅对例1中的代码做如下修改,其余代码不变

void f3()
{
float temp = 10;//temp改为float类型

try
{
throw temp;//抛出float类型的异常
}
catch (float)//捕获float类型异常
{
cout << "f3 catch!" << endl;//表示在函数f3中捕获到了异常
}

cout << "f3 end!" << endl;//表示函数f3结束
}

修改后代码的运行结果如下:



分析:我们将temp类型改为float,这样抛出的异常也变成了float类型。异常被抛出后,首先经本函数的catch(float)检测,发现类型匹配,则直接被本函数中的catch(float)捕获,然后顺利执行完本函数。而后再执行完f2、f1和主函数。所以进行异常捕获时,大家要注意异常类型的匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c cpp trycatch