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 在细节消息中包含能捕获失败的消息
异常消息应提供下列信息:
- 异常的名字
- 细节消息,比如粗略的描述
- 堆栈轨迹
- 与异常相关的值,包括参数和域。例如,数组越界异常的消息就包含上界、下界和下标值。
无论如何,异常的消息应该尽可能多地返回有关失败原因的信息,方便程序员处理。
TIP 64 努力使失败保持原子性
即使方法调用失败,对象也会保持在调用之前的状态,那么这种方法被称为具有失败原子性。
这有时非常重要,因为程序员往往希望能在这种异常中进行恢复。
有几个途径可以实现这种效果:
- 设计一个不可变的对象。如果对象是不可变的,失败原子性就是显然的。
- 对可变的对象,在执行操作之前检查参数的有效性。这可以使得在对象的状态修改之前,先抛出适当的异常。
- 编写一段恢复代码。这中方法很少被使用。
- 在对象的一份临时拷贝上执行操作,操作完成后,再用临时拷贝中的结果替代对象的内容。
例外情况:
- 多线程在没有同步机制的情况下,并发地修改同一个对象。这种情况下,对象很难保持方法失败之前的状态。
- 错误(Error)相对于异常,通常是不可恢复的。如果方法抛出错误,它们无需保持失败原子性。
一般而言,作为方法规范的一部分,方法产生的任何异常,都应该让对象保持在该方法调用之前的状态。
如果无法实现失败原子性,API文档就应该清楚地指明对象将处于什么样的状态
TIP 65 不要忽略异常
不要忽略异常!
不要在catch住异常后,什么动作都不做!
无论你是向高层传递异常,还是做必要的现场恢复,都不要忽略它,什么都不做!
- Effective Java读书笔记二一(Java Tips.Day.21)
- Effective Java读书笔记二二(Java Tips.Day.22)
- Effective Java读书笔记二(Java Tips.Day.2)
- Effective Java读书笔记二十(Java Tips.Day.20)
- Effective Java读书笔记二三(Java Tips.Day.23)
- Effective Java读书笔记二四(Java Tips.Day.24)
- Effective Java读书笔记二五(Java Tips.Day.25)
- Effective Java读书笔记二六(Java Tips.Day.26)
- Effective Java读书笔记一(Java Tips.Day.1)
- Effective Java读书笔记五(Java Tips.Day.5)
- Effective Java读书笔记六(Java Tips.Day.6)
- Effective Java读书笔记八(Java Tips.Day.8)
- Effective Java读书笔记九(Java Tips.Day.9)
- Effective Java读书笔记十(Java Tips.Day.10)
- Effective Java读书笔记十一(Java Tips.Day.11)
- Effective Java读书笔记十二(Java Tips.Day.12)
- Effective Java读书笔记十三(Java Tips.Day.13)
- Effective Java读书笔记十四(Java Tips.Day.14)
- js 开发遇到的问题
- Kotlin学习(一)简单了解下Kotlin
- python 列表去重(不可变类型和可变类型)
- 在centos7.x系统,配置docker私有镜像仓库
- 定时任务-spring-quartz
- Effective Java读书笔记二一(Java Tips.Day.21)
- 搞了一天,为了一个防火墙的没有禁止成功!!!redhat 7 & Oracle Linux 7 & Centos 7注意!!
- es6中的class类下
- 在centos下,关于docker环境变量文件的问题
- SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
- MongoDB C100DEV 2.CRUD
- Linux运维笔记-文档总结-postfix+mysql+dovecot
- Linux下安装tar.gz类型的jdk,并配置环境变量
- Fibonacci again and again(求sg函数)