为什么最好以引用方式捕捉异常

来源:互联网 发布:精密减速机 知乎 编辑:程序博客网 时间:2024/06/05 10:31

捕捉异常的方式有三种:值传递、引用、指针

引用与值传递相比:

1.值传递会复制两次,传给catch时,抛出时都会复制。引用只复制一次,效率大大提高。

2.值传递会带来切割问题。当传递派生类对象给参数是基类对象的catch时,会导致切割,即派生类的派生类成员被切割,

只留基类的部分。

引用与指针相比:

1.抛出指针时,不需要复制对象,只需复制指针,效率增加,但是,不能抛出指向局部对象的指针,因为函数调用完毕,局部对象被

销毁。

2.抛出指向堆对象的指针时,new完之后没办法delete,因为没有办法知道传来的是全局对象或者static 对象或者是堆上的对象,所以,delete or not delete这就成一个问题了。

3.catch-by-pointer和语言本身建立起来的惯例有所矛盾。4个标准的异常:

<1>:bad_alloc 当operator new无法满足内存需求时抛出。

<2>:bad_cast 当对一个对象实行向下转换(dynamic_cast)失败时抛出。

<3>:bad_typeid 当dynamic_cast被实施与一个null指针时抛出。

<4>:bad_excepition 适用于未预期的异常情况。

综上:引用是最好的选择,它不会产生上述问题。

原创粉丝点击