57.只针对异常的情况才使用异常
异常是为了异常情况下使用而设计的,不要将他们用于普通的控制流,不要编写迫使他们这么做的api
58.对可恢复的情况使用受检异常,对编程错误使用运行时异常
三种异常:受检的异常,运行时异常和错误
如果希望调用者能够适当的恢复,应该使用受检的异常。
用运行时异常表明编程错误。
错误往往被jvm保留用于表示资源不足,约束失败或者其他使程序无法继续执行的条件
59.避免不必要地使用受检的异常
60.优先使用标准的异常
61.抛出与抽象相对应的异常
更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常
public static void main(String[] args) {
Integer integer = 42;
Integer integer2 =42;
if(integer==integer2){
System.out.println(true);
}
try {
} catch (LowerLevelException e) {
throw new HigherLevelException()
}
}
62.每个方法抛出的异常都要有文档63.在细节消息中包含能捕获失败的消息
64.努力使失败保存原子性
失败的方法调用应该使对象保持在被调用之前的状态,具有这种属性的方法被称为具有失败原子性
几种办法可以实现这种效果:
1,设计一个不可变对象
2.在可变对象上执行操作的方法,在执行操作前检查参数的有效性,在修改之前,抛出异常
3.编写一段恢复代码,由它来拦截操作过程中可能发生的失败,以及使对象回滚到操作开始之前的状态上,这种办法主要用于永久性的数据结构
4,在对象的一份临时拷贝上操作,操作完成后再将临时拷贝的结果代替对象的内容
65.不要忽略异常