代码洁癖系列(六):处理错误
程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一。那么处理错误和代码整洁有什么关系呢?
前面我们提到过,try-catch代码块会破坏代码的结构。但是,我们在处理错误时又不得不使用try-catch代码块,这样才能让我们的程序保持健壮。那么如何兼顾整洁和健壮呢,这就是我们今天要讨论的内容。
不要使用返回码
在上古时期,很多语言还都不支持异常,程序员们只能约定好返回的错误码,通过不同的错误码对代码进行错误处理。这么做需要调用者在调用方法后马上判断返回值来决定是否需要处理错误。而这一步骤往往被遗忘,就会导致程序出现不可预估的问题。所以,现在我们有了throw和try-catch这样的“热武器”,就不要再用错误码这样的“冷兵器”了。不然很容易就会被别人给秒杀的。
try-catch-finally相信大家都很熟悉,不熟悉的话,可以前往本站达成合作的各大搜索引擎进行搜索,保证有答案。
异常抛出的层级
我们不希望程序中充满了try-catch代码块,这样会使程序的可读性变差。因此,我们要适当的使用throw语句,将异常抛出。交给上一层去处理。但是,如果只由最顶层的代码去处理异常,整个程序看上去是会整洁一些,但当我们需要修改某个底层代码抛出的异常时会发生什么呢?我们需要找到往上抛的每一个方法去修改它的签名,抛出新的异常,并重新发布。这会使我们的工作量增加好几倍。所以,我们的异常最好在本层进行统一处理,或者在抛出后的上一层就进行处理。
说明发生异常的环境
在Java中,系统异常通常会给出调用栈,便于我们进行问题的定位和调试。对于我们自己抛出的异常,也应该给出异常发生的环境,例如列出调用栈,给出请求参数等等。
远离null值
我们在读、写代码时,一定有被好多层的空指针判断折磨的经历。一不小心漏掉一个判断,那么程序就会出现空指针异常,这个异常要么被上层的catch捕获,要么直接抛出。很明显,这两种结果都不是我们想要的。怎么远离空指针异常呢?
首先,代码的返回值不要返回null。可以选择直接抛出一个异常,或者返回一个特定的值,比如空对象等。
其次,代码调用时,参数不要传null,因为一旦传null,那么在方法体中就需要对这个参数进行非空判断。而目前还没有什么好的方法可以简单高效的处理参数外部传来的null,只能使用if判断。因此希望大家在调用别的方法时尽量不要传入null。
小结
本文的主要目的是使我们的代码兼顾整洁性和健壮性。这就需要我们将错误处理独立于主逻辑之外,使错误就可以被单独处理,不但能够增强可读性,还能增强可维护性。最后得到的就是我们希望看到的整洁而健壮的代码。
欢迎关注我的个人公众号:代码洁癖患者
wechat-qcode.jpg