第7章 错误处理
7.1 使用异常而非返回码
返回码代码示例:
if(condition){
doSomething();
}else{
logger.log("something is wrong");
}
结果就是在调用包含这个代码的方法之后需要立即检查错误。
异常处理代码:
try {
doSomething();
}catch (SomeError e){
logger.log(e);
}
7.2 先写Try-Catch-Finally语句
主要好处是,可以定义在try代码中的事务范围,快速定位错误。(本书写于2010年,现在java已经足够强大,这个在好多地方已经很精确了,不需要我们自己动手,个人理解。)
7.3 使用不可控异常
其实我不懂这段说的啥,到时候看懂了再加上。
7.4 给出异常发生的环境说明
即 抛出的每个异常,应当给出足够的环境说明,便于判断出错误来源,错误原因。应当创建充分的错误信息和异常一同发出,信息包括失败操作和失败类型,异常中标出错误来源和位置。若有日志系统,传递足够的信息给 catch 块,并记录。
7.5 定义异常类
例如:
try {
doSomething();
}catch(AException e){
logger.log(e);
}catch(BException e){
logger.log(e);
}catch(CExcption e){
logger.log(e);
}finally{
doSomething2();
}
以上为一个不太好的例子,包含太多重复代码。
以下在主要部分保证逻辑清晰,将异常处理放置在不那么重要的部分。
try {
doSomething();
}catch(AllExceotion e){
loggger.log(e);
}finally{
doSomething2();
}
//将异常都放在一起
public void doSomething(){
try {
doSomething1();
}catch(AException e){
logger.log(e);
}catch(BException e){
logger.log(e);
}catch(CExcption e){
logger.log(e);
}finally{
doSomething2();
}
}
7.6 定义常规流程
主要就是创建一个类或者配置一个对象处理特例。
例如:
try{
m += a.getTotal();
}catch(XException e){
m += a.getTotal2();
}
给getTota()方法一个默认值,当有异常时,返回默认值就行。
m += a.getTotal();
这时代码会更简洁,也会有更少的异常行为。
7.7 别返回null值
返回null值,很容易触发 NullPointException ,尽量抛出异常,或者返回特例对象。
7.8 别传递null值
除非api要求,否则尽量别传递null值。