C++异常处理的理解
来源:互联网 发布:什么是好的相声知乎 编辑:程序博客网 时间:2024/04/30 19:06
1.异常的基本概念和选择
异常处理try语句会导致比较大的开销,异常规范也会导致比较多的开销(每个都比自己原来大概增大5%-10%左右,速度也减慢原来同等的比例,原因是需要额外的内存和计算来详细记录执行过程中状态)。因此选择使用异常处理需要谨慎。
异常处理异于函数调用的地方是函数调用会保留现场,原地返回;异常却是抛出来以后就不会再回来。因此使用异常需要很了解异常。
2.抛出值,捕获引用是正确使用异常的形式-try{}catch(Type &t){}
异常抛出的数值会截取转换,不会使用多态,例如try{ throw childClassObj} catch( FatherClass obj){ }那么会将子类截断为父类,且调用的多态函数不会是子类的,而是父类的函数。且抛出值,throw会赋值一次,catch又会赋值一次。
异常抛出指针,如果是局部变量的指针那么指针会是一个野指针,如果是堆或者全局指针又面临删除堆指针数据的问题,删还是不删。
异常抛出一个值,然后catch一个引用,则只是拷贝了一次值,就可以解决值的多次拷贝和类型转换截取的问题,还可以不用删除指针的问题。
3.异常规范要谨慎使用
规定一个函数抛出来的异常是很难去处理好的,因为这个函数可能抛出其它的异常或者规定的异常,这样A控制B的异常时候就比较难处理。所以一般不使用异常规范是比较好的做法。
编译器仅仅能部分地检测它们的使用是否一致,在模板中使用它们会有问题,一不注意它们就很容易被违反,并且在缺省的情况下它们被违反时会导致程序终止运行。异常规格还有一个缺点就是它们能导致unexpected被触发,即使一个high-level调用者准备处理被抛出的异常。
Session::~Session()
{
try {
logDestruction(this);// 若异常规范规定该函数不抛出异常,但是内部发生了其它异常,异常会被传递而终止,但是捕获不到了。
}
catch (...) { }
}
参考文章:
<<More+Effective+C++>>
0 0
- C++异常处理的理解
- C语言的异常处理
- C语言的异常处理
- C语言的异常处理
- c的异常处理学习
- C++&Qt的异常处理
- 有关java的异常处理的理解
- 我理解的windows异常处理
- java异常处理机制的深入理解
- 我理解的windows异常处理
- 我理解的windows异常处理
- 对Java异常处理的理解
- 深入理解java的异常处理机制
- 对于JAVA处理异常的理解
- 异常处理(二、C语言的异常处理)
- 异常处理理解
- java异常处理理解
- Java 异常处理 理解
- C++构造函数和析构函数异常
- 设计模式之单例模式
- # WinForm开发系列 - Form/Window
- C++运算符及其重载问题
- 水3_NYOJ_305
- C++异常处理的理解
- Act with Prudence
- 我转载的文章
- Apply Functional Programming Principles
- 在ubuntu14上面安装docker
- 主流.Net的IOC框架性能测试比较
- Ask, “What Would the User Do?” (You Are Not the User)
- c++的boost库学习笔记
- Gitlab 架构---postgresql