错误处理之异常与返回码

众所周知,在程序运行出现异常的时候,我们可以选择抛出异常或者返回错误码的方式来进行处理,那么他们两个之间有什么区别?各有什么优缺点?在什么情况下选择抛异常,什么情况下选择返回码呢?下面我们来逐步分析。

1.抛异常 VS 错误码

首先,我们来分析一下抛异常和错误码相比的优缺点:
优点:
1.代码可读性高:在异常处理代码的try...catch...finally逻辑结构中,try是正常处理逻辑代码,catch是针对某种或者某类异常的异常处理代码,finally是资源清理代码。如此来看,各个功能的逻辑代码划分分门别类,看起来很清晰,代码可读性比较高
2.可以链式调用或者嵌套调用:在抛异常的处理方式下,可以使用add(sub())这种函数嵌套的调用方式以及add().sub()这种函数链式调用方式。然而如果采用返回错误码这种方式,正确的做法是:对于每个函数的执行,都需要我们首先获取其返回值,然后通过错误码判断函数执行的过程是否出现异常。因此是没办法使用嵌套调用或者链式调用的。
3.异常是无法忽略的。抛出的异常都必须通过catch来处理,也就是说异常是必须处理、无法忽略的。然而没有强制机制要求对错误码强制处理,返回的错误码完全可以被忽略。
4.由于抛出的异常是一个对象,因此在java中,可以采用多态的方式来处理。众所周知,多态的好处可以提高代码的扩展性
缺点:
然而抛出异常的方式在抛异常时,首先需要生成一个异常对象,并且需要维护一个栈用来跟踪异常情况,一直跟踪到我们捕捉到异常并且进行处理后截止,这样其实是比较耗费性能的。所以,与返回错误码相比的缺点就是性能低下。

2.应用场景

上面分析过,抛出异常的方式是比较耗费性能的,然而在程序正常处理、异常没有抛出的情况下,程序性能是不会受到影响的。由于上述所说的抛异常代码可读性高等四个优点,所以当我们觉得程序运行不会出现异常时,优先选择抛异常。如果可以预知程序可能会出错,为了性能考虑,那么则可以选择返回错误码。
那么什么情况是可以预知到程序运行会出现异常,什么情况下是预知程序不会出现异常呢?
可以预知到异常的情况:
1.用户的输入,例如password错误等
可以预知程序不会出现异常:
1.空指针,非法参数等
2.资源错误:内存溢出、stack overflow等

猜你喜欢

转载自www.cnblogs.com/levy5307/p/9229650.html