1、返回值判断 这个错误处理的方法是最普遍的,也是在过程化程序设计中的经典的错误处理方法。至今也是最多人使用的方法。 int nRet = DoThing1(); err: 使用这种方法来进行错误处理,当写代码的时候,我们需要不断的提醒自己,这个函数会返回什么错误呢?错误具体是什么呢?然后就翻查函数说明手册,接着对每个错误的返回都要给出提示,大部分的工作都压到调用者的身上,使调用者不能专注的处理程序的逻辑。而且,可能会有没有被处理的错误(函数调用者如果不判断返回值的话)。所以,这种方法是不好的,设计一个接口的时候不应该要客户程序承担过多的工作,一个接口应该尽量简单。
由于上面的严厉“谴责”,接口的设计者有点惭愧了,他就想:不就让调用的人舒服吗?好!灵光一闪,他想出了一个方法来,这个方法可以让我们不用去翻查函数的说明手册了,任何时候,只要出现错误就调用一个统一的接口GetLastError(),这个接口就会告诉我们最近发生的错误是什么了。 其中的经典代码就是类似这样的: if(DoThing1() == ERROR) 呵呵,使用这种方法,你没得说了吧。接口的设计者又洋洋得意了!!但是这样的调用方法仍然使得if等的判断语句充斥在整段代码中,在代码中太多这样的判断代码会严重影响程序的可读性和逻辑。而且,这种方法归根到底还是过程化的思想,一点也没有反应出我们的面向对象精神。
呵呵,面向对象又登场了,面向对象的精神就是“万物皆对象”,“只要你留意它了,它就是对象”,好,我们不是留意“错误”吗?那我们就把错误当成对象。错误有级别的区别,所以可以把一堆错误组织成一个继承的关系。 在使用异常处理的方法中,异常是一种对象,这个异常就像现实中的“妖怪”一样,我们要捕抓它,当抓到它之后,我们就严刑逼供,让它告诉我们它是何方“妖物”(因为对象有对自身负责的特性)。经典的代码就象下面一样: try 这样做的话,代码就清爽多了,而且如果我们在某层没截取到异常的时候,异常不会丢,它会继续往外层传,所以就不会有漏网之鱼。 // DoThing1() 可能调用了其他人的接口 DoThing1() // DoThing2() 可能调用了其他人的接口 DoThing2() // main() 调用了我们的接口 void main() 在try块中我们不用去管错误,只管逻辑,而在catch块中,我们才进行错误的处理。 这就有点像JAVA的代码了,但是我们C++ 程序员没办法象JAVA程序员一样完全使用异常处理,这是有历史原因的,因为异常处理关系到整套异常类的定义。JAVA已经定义了一个完整的类库,所有的错误处理都用异常来表示。但是我们C++程序员还是有很多的函数库是使用返回值的方法来做的。所以为了兼容C,我们没办法做到完全使用异常处理。
|
|