异常

笔记:

exception:
    1、只针对异常的情况才使用异常
    2、对可恢复的情况使用受检异常,对编程错误使用运行时异常
        三种可抛出结构:checked exception、 run-time exception、 error
        如果期望调用者能适当地恢复,对于这种情况就应该使用受检的异常。通过抛出受检的异常,强迫调用者在一个catch子句中处理该异常,或者将它传播出去
        两种未受检的可抛出结构:运行时异常和错误。在行为上两者是等同的:它们不需要也不应该被捕获的可抛出结构。如果程序抛出未受检的异常或者错误,往往就属于不可恢复的情形,急速执行下去有害无益。
        用运行时异常来表示变成错误,大多数的运行时异常都表示前提违例,就是指API的客户没有遵守API规范建立的约定
        异常也是个完整意义上的对象,可以在它上面定义任意的方法,为捕获异常的代码提供额外的信息。
    3、避免不必要地使用受检的异常
    4、优先使用标准的异常
        IllegalArgumentException
        IllegalStateException
        NullPointException
        IndexOutOfBoundsException
        ConcurrentModificationException
        UnsupportedOperationException
    5、抛出与抽象相对应的异常
        高层的实现应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译。
        一种特殊的异常转译形式称为异常链,如果底层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。低层的异常被传到高层的异常,高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。高层异常的构造器将原因传入到支持链的超级构造器,因此它最终将被传给Throwable的其中一个运行异常链的构造器,例如Throwable:
        class HigherLevelException extends Exception {
            HigherLevelException(Throwable cause) {
                super(cause);
            }
        }
    6、每个方法抛出的异常都要有文档
        是重要单独地声明受检的异常,并且利用javadoc的@throws标记,准确地记录下抛出每个异常的条件
        对于接口中的方法,在文档中记录下它可能抛出的未受检异常显得尤为重要,这份文档构成了该接口的通用约定的一部分,它指定了该接口的多个实现必须遵循的公共行为。
    7、在细节消息中包含能捕获失败的信息
        当程序由于未被捕获的异常而失败的时候,系统会自动地打印出该异常的堆栈轨迹。在堆栈轨迹中包含该异常的字符串表示法,即它的toString方法的调用结果。它通常包含该异常的类名,紧随其后的是细节消息。
        为了捕获失败,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值“。例如IndexOutOfBoundsException异常的细节消息应该包含下界、上界以及没有落在界内的下标值
    8、努力使失败保持原子性
        一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法称为具有失败原子性。
        有几种途径可以实现这种效果:
            最简单的方法莫过于设计一个不可变的对象,如果对象是不可变的,失败原子性就是显然的;对于在可变对象上执行操作的方法,获得失败原子性最常见的方法是,在执行操作之前检查参数的有效性。这可以使得在对象的状态被修改之前,先抛出适当的异常;
            一种类似的获得失败原子性的办法是,调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象状态被修改之前发生;
            第三种获得失败原子性的方法远远没有那么常用,做法是编写一段恢复代码,由它来拦截操作过程中发生的失败,以及使对象回滚到操作开始之前的状态上
            最后一种获得失败原子性的办法是,在对象的一份临时拷贝上执行操作,当操作完成之后,再用临时拷贝中的结果代替对象的内容
    9、不要忽略异常
            至少,catch快也应该包含一条说明,解释为什么可以忽略这个异常

  有关代码:

package chapter8;

import java.util.ListIterator;
import java.util.NoSuchElementException;

/**
 * @author zhen
 * @Date 2018/10/9 14:04
 */
public class Demo <E> {

//    public E get(int index) {
//        ListIterator<E> i = listIterator(index);
//        try{
//            return i.next();
//        }catch (NoSuchElementException e) {
//            throw new IndexOutOfBoundsException("Index:" + index);
//        }
//    }
}
Demo

 

posted @ 2018-10-09 17:09  guodaxia  阅读(102)  评论(0)    收藏  举报