错误处理只不过是编程时必须要做的事之一,当错误发生时,程序员就有责任确保代码照常工作
7.1 使用异常而非返回码
- 遇到错误时,最好抛出一个异常,这样调用代码时就会更简单,也就更简洁,其逻辑不会被错误处理搞乱
7.2 先写 try-catch-finally 语句
- 执行
try-catch-finally
语句中 try 部分的代码时,其实是在表明随时可以取消执行,并在 catch 语句中继续 - 在编写可能抛出异常的代码时,最好先写出
try-catch-finally
语句,这可以帮助定义代码正常运行时可以得到什么结果
7.3 使用不可控异常
- 如果在方法中抛出可控异常,但 catch 语句在三个层级之上,调用时就需要在 catch 语句和抛出异常的代码之间的每个方法签名中声明并向上抛出该异常
- 这将会导致程序代码耦合度极高,之后如果异常发生变化,之前抛出过该异常的每个地方都得作出相应修改
- 也许你认为有时候必须捕获异常,但对于一般的应用开发,其依赖成本要高于收益
7.4 给出异常发生时的环境说明
- 抛出的每个异常,都应当提供足够的环境说明,以便判断错误的来源
- 在抛出异常之前,应该创建信息充分的错误消息,并和异常一起传递出去
7.5 依调用者需要定义异常类
- 在应用程序中定义异常类时,最重要的是考虑它们应该如何被捕获
- 伴随异常发送出来的信息最好能够区分不同错误
- 如果想要捕获某个异常,并且放过其他异常,就使用不同的异常类专门针对某个异常
7.6 定义常规流程
- 创建一个类或配置一个对象,来处理特例,叫做 特例模式( Special Case Pattern )
- 将异常行为封装在特里对象中,调用端的代码就不用再处理异常行为了
7.7 别返回 null 值
- 返回 null 值时,基本上都是在给自己增加工作量,也是给调用者添乱
- 尽量避免 NullPointerException 的出现,代码也就更整洁了
7.8 别传递 null 值
- 除非 API 要求你向其传递 null 值,否则尽可能避免传递 null 值
7.9 小结
- 整洁代码是既可读,又强壮的
- 如果将错误进行隔离处理,独立于主要逻辑之外,就能写出强壮而整洁的代码