C++学习笔记——异常处理匹配与函数嵌套
2018-01-31 16:26
441 查看
问题背景:C++中,使用catch语句来捕获异常,即catch(异常类型),那么在有函数嵌套时,异常类型是如何匹配的呢?
例1:请看如下代码
运行结果如下:
![](https://img-blog.csdn.net/20180131160832307?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTE1NDI5OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
分析:原始异常来自函数f3,该异常是double类型。根据控制台打印结果,我们可以看到异常直接被主函数捕获,然后代码运行结束。这是因为只有主函数的catch(double)语句与f3中抛出的异常类型相同。函数f3在抛出异常之后,会立刻离开本函数中的try,经本函数中的catch检测不匹配之后,不再继续执行本函数,而是会一层层向上传递,直到异常被传递到主函数,被主函数中的catch(double)捕获,然后顺利执行完主函数。为了验证这一观点,请看例2。
例2:我们仅对例1中的代码做如下修改,其余代码不变
修改后代码的运行结果如下:
![](https://img-blog.csdn.net/20180131162302761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTE1NDI5OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
分析:我们将temp类型改为float,这样抛出的异常也变成了float类型。异常被抛出后,首先经本函数的catch(float)检测,发现类型匹配,则直接被本函数中的catch(float)捕获,然后顺利执行完本函数。而后再执行完f2、f1和主函数。所以进行异常捕获时,大家要注意异常类型的匹配。
例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++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间
- C++学习笔记(6)-异常处理
- C++ FAQ学习笔记 17章 异常和错误处理
- Struts2学习笔记三(异常处理、模型驱动和属性驱动、servlet接口、Preparable接口)
- Python学习笔记--异常处理
- Silverlight3学习笔记6(Silverlight,WCF双工通信)(回调异常问题处理)
- 黑马程序员 - 学习笔记9 异常处理的初步了解
- 黑马程序员——Java异常处理学习笔记
- C++学习笔记--异常简介
- 中断+异常处理【学习笔记】
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理
- 学习笔记-小甲鱼Python3学习第三十二、三十三讲:异常处理:你不可能总是对的
- Matlab图像处理学习笔记(三):基于匹配的目标识别
- 作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
- 【C++学习笔记】函数匹配和函数指针
- C/C++学习----第六章 异常处理
- JNI 学习笔记(三)-- JNI访问数组、引用、异常处理、缓存策略
- Guava学习笔记:简化异常处理的Throwables类
- c++学习笔记序列之经典处理程序汇总(不断更新中)
- scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归