More Effective C++:通过引用捕获异常
}; //有关它的信息 class runtime_error: //也来自标准C++异常类 public exception { ... }; class Validation_error: // 客户自己加入个类 public runtime_error { public: virtual const char * what() throw(); // 重新定义在异常类中 ... //虚拟函数 }; // void someFunction() // 抛出一个 validation { // 异常 ... if (a validation 测试失败) { throw Validation_error(); } ... } void doSomething() { try { someFunction(); // 抛出 validation } //异常 catch (exception ex) { //捕获所有标准异常类 // 或它的派生类 cerr << ex.what(); // 调用 exception::what(), ... // 而不是Validation_error::what() } } 调用的是基类的what函数,即使被抛出的异常对象是Validation_error和 Validation_error类型,它们已经重新定义的虚拟函数。这种slicing行为绝不是你所期望的。 最后剩下方法就是通过引用捕获异常(catch-by-reference)。通过引用捕获异常能使你避开上述所有问题。不象通过指针捕获异常,这种方法不会有对象删除的问题而且也能捕获标准异常类型。也不象通过值捕获异常,这种方法没有slicing problem,而且异常对象只被拷贝一次。 我们采用通过引用捕获异常的方法重写最后那个例子,如下所示: void someFunction() //这个函数没有改变
这里没有对throw进行任何改变,仅仅改变了catch子句,给它加了一个&符号。然而这个微小的改变能造成了巨大的变化,因为catch块中的虚拟函数能够如我们所愿那样工作了:调用的Validation_erro函数是我们重新定义过的函数。 如果你通过引用捕获异常(catch by reference),你就能避开上述所有问题,不会为是否删除异常对象而烦恼;能够避开slicing异常对象;能够捕获标准异常类型;减少异常对象需要被拷贝的数目。所以你还在等什么?通过引用捕获异常吧(Catch exceptions by reference)! |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |