北京八维研修学院通过引用捕获反常 当你写一个catch子句时,必需确定让反常通过何种体例传递到catch子句里。你能够有三个抉择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by reference)。
我们起首议论通过指针体例捕获反常(catch by pointer)。从throw处传递一个反常到catch子句是一个迟缓的过程,在理论上那种办法的实现关于那个过程来说是效率更高的。因为在传递反常信息时,只要摘用通过指针抛出反常的办法才气够做到不拷贝对象,例如:
class exception { ... }; // 来自原则C++库(STL)
// 中的反常类条理
void someFunction()
static exception ex; // 反常对象
throw ex; // 抛出一个指针,指向ex
void doSomething()
try {
someFunction(); // 抛出一个 exception*
catch (exception *ex) { // 捕获 exception*;
... // 没有对象被拷贝
那看上往很不错,但是现实情状却不是如许。为了能让法式一般运行,法式员定义反常对象时必需确保当法式掌握权分开抛出指针的函数后,对象还可以陆续保存。全局与静态对象都可以做到那一点,但是法式员很随便忘记那个约束。假设实是如斯的话,他们会如许写代码:
void someFunction()
exception ex; // 部分反常对象;
// 当退出函数的保存空间时
// 那个对象将被释放。
throw ex; // 抛出一个指针,指向
... // 已被释放的对象
那几乎蹩脚透了,因为处置那个反常的catch子句承受到的指针,其指向的对象已经不再存在。