Effective Java读书笔记二一(Java Tips.Day.21)

来源:互联网 发布:网络编程课程 编辑:程序博客网 时间:2024/06/04 01:18

TIP 60 优先使用标准的异常


一般来说,你无需实现新的异常类型。


JDK提供了一组基本的未受检的异常,满足绝大多数API的异常抛出需要。其中包括:

IllegalArgumentException
IllegalStateException
NullPointerException
IndexOutOfBoundsException
ConcurrentModificationException
UnsupportedOperationException

它们是最常被重用的异常。


TIP 61 抛出与抽象对应的异常


如果方法抛出的异常与它执行的任务没有明显关系,往往会使程序员产生疑惑。

而且,由实现细节抛出的(低层)异常往往污染了更高层的API。如果高层的实现在后续的发行版本中发生了变化,它所抛出的异常也可能跟着发生变化,从而潜在地破坏现有的客户端程序。


异常转译:

  • 为了避免上述问题,更高层的实现应该捕获底层的异常,并抛出可以按照高层抽象进行解释的异常。

一般方案:

  • 如果高层API需要调用低层的方法,而且这个低层的方法可能会抛出异常,那么,最好的做法是在调用低层方法之前,确保低层方法一定成功执行。比如做参数检查、上下文环境检查等等。
  • 如果无法避免低层异常,就做异常转译,除非低层异常也适用于高层API抽象。
  • 使用异常链,参考TIP 63.

TIP 62 每个方法抛出的异常都要有文档


使用Javadoc的@throws标记,准确地记录下抛出的每个异常。


要为你编写的每个方法所抛出的每个异常建立文档 , 无论受检和未受检的异常,抽象的和具体的方法。

为每个受检异常提供单独的throws 字句,并且,无需为未受检的异常提供throws字句。


TIP 63 在细节消息中包含能捕获失败的消息


异常消息应提供下列信息:

  1. 异常的名字
  2. 细节消息,比如粗略的描述
  3. 堆栈轨迹
  4. 与异常相关的值,包括参数和域。例如,数组越界异常的消息就包含上界、下界和下标值。

无论如何,异常的消息应该尽可能多地返回有关失败原因的信息,方便程序员处理。


TIP 64 努力使失败保持原子性


即使方法调用失败,对象也会保持在调用之前的状态,那么这种方法被称为具有失败原子性。

这有时非常重要,因为程序员往往希望能在这种异常中进行恢复。


有几个途径可以实现这种效果:

  1. 设计一个不可变的对象。如果对象是不可变的,失败原子性就是显然的。
  2. 对可变的对象,在执行操作之前检查参数的有效性。这可以使得在对象的状态修改之前,先抛出适当的异常。
  3. 编写一段恢复代码。这中方法很少被使用。
  4. 在对象的一份临时拷贝上执行操作,操作完成后,再用临时拷贝中的结果替代对象的内容。

例外情况:

  1. 多线程在没有同步机制的情况下,并发地修改同一个对象。这种情况下,对象很难保持方法失败之前的状态。
  2. 错误(Error)相对于异常,通常是不可恢复的。如果方法抛出错误,它们无需保持失败原子性。

一般而言,作为方法规范的一部分,方法产生的任何异常,都应该让对象保持在该方法调用之前的状态。

如果无法实现失败原子性,API文档就应该清楚地指明对象将处于什么样的状态


TIP 65 不要忽略异常


不要忽略异常!


不要在catch住异常后,什么动作都不做!

无论你是向高层传递异常,还是做必要的现场恢复,都不要忽略它,什么都不做!

阅读全文
0 0
原创粉丝点击