More Effective C++ 条款13 以reference方式捕捉exception
1. 由条款12知,如果catch子句捕获异常采用按值传递,那么被抛出的异常要被复制两次,这降低了效率,而且将派生类对象传给基类对象有可能会产生切割问题,但是按值传递也有它的好处,在catch子句重新throw异常的时候,它可以选择throw经catch子句处理过的异常还是原来的异常,这增加了灵活性(throw;)
2. 按指针传递似乎可以避免异常的复制,(虽然指针还是要被复制,不过4字节的代价不高),但是要注意指针指向的不能是局部对象,因为局部对象会被销毁,这就要求指针指向动态分配的内存,但由此又产生额外问题,那就是内存释放问题,使用者必须时刻注意内存的释放,这加重了负担,而且程序员还必须知道指针指向的是不是动态分配的内存。
3. 按引用传递对象只需要被复制一次,同时也可以避免传入catch子句时对象的切割问题,同时也支持多态(虚函数调用时的RTTI),但重新throw的时候仍然不能避免切割问题(除了使用“throw;"语句)
4. 注:《More Effective C++》中在这一节提倡使用按引用传递,但我认为按引用与按值各有其优缺点(按引用传递优点确实多一些),不过按指针传递还是不要使用为好。