博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析c++异常
阅读量:4030 次
发布时间:2019-05-24

本文共 1827 字,大约阅读时间需要 6 分钟。

   异常处理:异常,让一个函数发现自己无法处理的错误时抛出异常,让函数的调用者直接或间接的处理这个问题。

传统错误处理办法

1、终止程序。(如段错误等)

2、返回错误码。

3、返回合法值,让程序处于某种非法的状态。(坑货)

4、调用一个预先设置的出现错误时调用的函数。

虽然可以解决问题,但都存在缺陷,然而引入异常处理可以很好的解决问题。

异常的抛出和捕获

1、异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个处理代码。

2、被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。

3、抛出异常后会释放局部存储对象,所以被抛出的对象也就还给系统了,throw表达式会初始化一个抛出特殊的异常对象副本(匿名对象),异常对象由编译管理,异常对象在传给对应的catch处理之后撤销。

栈展开

抛出异常的时候,将暂停当前函数的执行,开始查找对应的匹配catch子句,本层没找到时就不断向外层寻找,若到达main函数的栈,依旧没有匹配的,则终止程序。

找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行。

具体实现如下:

#include
using namespace std;#include
class Exception{public: Exception(int errId, const char* errMsg = "") :_errId(errId) , _errMsg(errMsg) {} void What()const { cout << "errId:" << _errId << endl; cout << "errMsg:" << _errMsg << endl; }private: int _errId;//错误码 string _errMsg;//错误信息};//异常的抛出void Func1(bool isThrow)//抛出Exception对象{ if (isThrow) throw Exception(1, "抛出Exception对象"); cout << "Func1->" << isThrow << endl;}void Func2(bool isThrowString,bool isThrowInt)//抛出string和int对象{ if (isThrowString) throw string("抛出string对象"); if(isThrowInt) throw 7; cout << "Func2->" << isThrowString <<" "<
<< endl;}void Test(){//异常的抛出 try {    //Func1(true);Func2(true, true);此时只执行Func1(true),由于Func1()函数存在异常 //同理针对下面程序,不执行Func2()的第二个参数的异常抛出 //从调试中可以发现异常处理会跳出,造成程序执行中断 Func1(false); Func2(true,true); } catch (const string& errMsg) { cout << "Catch string Object:" << errMsg << endl; } catch (int errId) { cout << "Catch int Object:" << errId << endl; } catch (const Exception& e) { e.What(); } catch (...) { cout << "未知异常" << endl; } cout << "Func()" << endl;}

异常的重新

有可能单个的catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用链函数来处理,catch则可以通过重新抛出将异常传递给更上层的函数进行处理。

异常与构造函数&析构函数

1、构造函数完成对象的构造和初始化,需要保证不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化。

2、析构函数主要完成资源的清理,需要保证不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄未关闭等)

本文出自 “” 博客,请务必保留此出处

转载地址:http://uilbi.baihongyu.com/

你可能感兴趣的文章
linux mint下使用外部SMTP(如网易yeah.net)发邮件
查看>>
北京联通华为光猫HG8346R破解改桥接
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
2017阿里内推笔试题--算法工程师(运筹优化)
查看>>
python自动化工具之pywinauto(零)
查看>>
python自动化工具之pywinauto(四)——批量转换exe视频
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>