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
原创粉丝点击