目录
错误处理
1 使用异常而不是错误码
旧有的判断错误多在要不返回错误码,要不就是使用错误判断标志。
错误判断标志就是对返回结果判断时==
的右侧值。
举个例子:
result := user.getResult();
if result == resultError{
...
return resultErrorCode;
}
比如这里的resultError
就是错误判断标志。resultErrorCode
就是错误码。
使用错误码的步骤,就是每一次返回都需要进行判断。导致if滥用,代码不美观的请赶快。或者忘记判断,导致出现潜在的漏洞。
2 先写try-catch-finally
面对可能出现错误的地方,应该先写try-catch-finally,然后再编写里面的代码块。
这样做的目的是让代码的目的性更清晰,能让人知道每个代码块的作用。
3 使用未检异常
未检异常和已检异常是Java中对不同异常的分类,其中已检异常是要求一定要进行处理的。也叫可控异常,在可控异常一旦在较低层的代码进行修改,也会不断影响上层代码,直到catch。从而导致了一种很丑的代码。
它违反了开放闭合原则(对扩展开放,对修改关闭)。
4 给出异常发生的环境说明
描述异常发生的环境说明应该尽可能的详细,不应该只是一句描述性的话。
例如:某某错误发生了。
我们应该尽量的添加上,相关的值,或者是触发时,各个变量的实际值。
在查错时,才能更精准的发现问题所在。
5 根据触发的条件可以定义异常类
这里说的异常类是指,将可能出发的异常的代码,包装在一个类里的方法里。
因为一旦触发异常,可能会触发很多各异常判断,这样我们可以通过这个异常类封装这些异常判断,从而减少正常代码流程里面的try-catch-finally代码块。
6 定义常规流程
这里的定义常规流程是相对与使用try-catch-finally代码块来说的,我们可以通过特殊的方法来处理出现异常的情况,从而减少这些异常处理模块的数量,让代码看起来更简洁。
比如说:
try{
getUserName();
}catch(UserException e)
setUserName(defaultName);
getUserName();
}
这里就是捕获到拿不到用户名的异常时,重新设置用户名,再返回。
我们可以使用特例模式
(创建一个类或者配置一个对象来处理这些特殊的情况)。
举个例子:
public class User{
public String getUserName(){
if (userName == ""){
setUserName(defaultName);
}
return userName;
}
}
通过特例模式来处理这种情况,这样我们就不需要去处理这个异常了。
7 别返回null值
当方法返回值可以是一个null值的时候,这样我们上层使用返回对象的时候就需要先对对象进行一个是否为null值的判断。
8 别传递null值
同样的是,当传递对象的时候,如果传入空值,可能会再函数内部使用的时候,突然报出空指针异常的信息。当然可以再里面再进行判断,但是当我们不传递空值,就会从根源解决烦恼。
9 小结
把错误处理独立于主体逻辑之外,会使得代码更整洁。