C++编程里面有几个地方非常麻烦,字符串,内存管理,以及错误处理。
C++里有大量的代码都是处理错误,每调用一次Win32 API,每调用一次COM操作,甚至连调用一次new都要判断。(我个人从来都不判断new是否返回空指针,不知道这对不对)因此有人说写C++代码时,50%的代码在处理错误判断。既然C++处理异常的情况这么多,那么总结出一套优秀的处理错误的方式是很必要的。我们先来看传统处理,沿用C语言式的处理方式,每次操作检查一下返回值。如果操作失败,则释放资源,一层层的检查,直到最后回到调用函数。如果这样的话,判断返回值的地方同调用层次成正比,代码显得很臃肿。我之前就是这么做的,并且没有使用资源管理的类,可想而知代码有多乱。最近我改用了异常加资源管理的方式,代码一下简洁了很多。
资源管理,即把函数用到的局部资源用类包装起来,函数无论以哪种方式退出,只要调用了构造函数的类一定都可以调用析构函数,即使退出,在析构函数里面进行真正的资源释放。而异常,则可以减少很多重复的错误判断。如果一个函数很依赖它调用的函数的成功返回,则它可以不用捕获内部抛出的异常,直接把异常向最外层抛去即可。最坏的情况,没有任何地方捕获异常,那也很合理,因为程序运行的最基本的资源不能得到满足,则崩溃掉也是合理的。程序逻辑处理起来也很简单,函数无法进行下去的时候抛异常,外层处理函数如果觉得它可以处理,则捕获异常,进行补救。
异常通常用来处理输入方面,主要资源获取方面,比如文件操作,数据库操作,网络操作,权限,硬件资源,或者依赖其他库支持等等,用异常来处理错误很方便。
但其他地方,应该都是程序可以预见的,则不建议用异常,如果这些地方出问题,则多半程序有问题。
很久之前听有人说导致性能低下,而不使用异常。不过我几天前看到篇文章,说如果异常没有触发,执行起来还是很快的。异常是很有必要用的,分摊下来性能损失可以忽略。
另外分享两个我写的资源管理的类。
代码明天贴上来。