关于C++异常方面的问题
来源:互联网 发布:约瑟夫环java环形链表 编辑:程序博客网 时间:2024/06/06 03:26
关于C++异常方面的问题
异常:当一个函数发现自己无法处理的错误时抛出异常,让函数的调用者直接或间接的处理问题
1、传统处理错误的方法:
(1)终止程序
(2)返回错误码
(3)返回合法值,让程序处于某种非法的状态
(4)调用一个预先设置的出现错误时调用的函数 ---回调函数
2、异常的抛出和捕获
(1)异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个处理代码
(2)被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个
(3)抛出异常后会释放局部存储对象,所以被抛出的对象也就还给了系统,throw表达式会初始化一个抛出特殊的异常对象副本(匿名对象),异常对象由编译管理,异常对象在传给对应的catch处理之后撤销
抛出异常的时候,会暂停当前函数的执行
3、异常捕获的规则
异常对象的类型与catch说明符的类型完全匹配
只有以下几种情况例外
(1)允许从非const对象到const的转换
(2)允许从派生类型到基类类型的转换
(3)将数组转换为指向数组类型的指针,将函数转换为指向函数类型的指针
保证不能在构造函数和析构函数中抛出异常,否则会导致对象不完整或没有完全初始化或者内存泄漏
4.模拟实现Exception类
#include#include using namespace std;class Exception{public:virtual const char* what()const = 0; //声明为纯虚函数Exception(int errId, string errMsg):_errID(errId), _errMsg(errMsg){}protected:int _errID;string _errMsg;};class BadAlloc :public Exception{public:BadAlloc(const char* msg = ""):Exception(1, msg){_errMsg = _errMsg + ":alloc memory failed";}virtual const char* what()const{return _errMsg.c_str();}};template //模板函数,模拟newT* New(){T* p= (T*)malloc(sizeof(T));if (p == 0){throw BadAlloc("New failed:");}return new(p) T; //new定位表达式}struct AA{AA(){cout << "AA()" << endl;}};int main(){try{AA* p1 = New ();int* p2 = New ();}catch (BadAlloc e){cout << e.what() << endl;}catch (const Exception& e){cout << __LINE__ << e.what() << endl;}}
5、比较返回异常和返回错误码优缺点
(1)异常捕获后能清除的看到错误的原因,错误码只是整型,不能描述准确的错误原因
(2)异常会打乱执行流影响调试分析代码
(3)异常会有异常安全的问题,需尽量使用RAII配合使用
(4)很多第三方库再用异常
(5)很多测试框架使用异常
0 0
- 关于C++异常方面的问题
- 关于C语言方面的问题 请高手指教
- 关于网络异常方面的建议
- 关于网页方面的问题
- 关于SVN方面的问题
- C字符串方面的问题
- 关于.net技术方面的问题!
- 关于SQL语句方面的问题
- iOS8关于推送方面的问题
- C++关于编译链接方面的问题
- 关于windows服务方面的一些问题
- 关于进程管理方面的问题
- 关于在WEB这方面对异常的处理
- tomcat启动,关于网络异常方面的建议!
- 关于异常的问题
- 关于异常的问题
- 关于iOS中object-C方面的面试题汇总
- 关于Object-C有关接口方面的应用
- 修改安兔兔中8GB存储显示
- bzoj3467
- Redis服务器命令
- 100道动态规划——37 UVA 1218 Perfect Service 树形DP 分析问题
- python学习笔记:2017/4/19---2
- 关于C++异常方面的问题
- java读取properties文件的几种方法
- linux服务器MySQL自动备份(小白轻松掌握)
- 类和对象习题
- solrcloud实现
- 深度优先搜索与广度优先搜索
- HTTP协议学习笔记六
- 使用FileReader对象的readAsDataURL方法来读取图像文件
- shell脚本参数可以包括空格嘛