首页 > 代码库 > 《JAVA编程思想》学习笔记——第十二章 通过异常处理错误

《JAVA编程思想》学习笔记——第十二章 通过异常处理错误

    Java的基本理念是 "结构不佳的代码不能运行"

    发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。这就需要错误源能通过某种方式,把适当的信息传递给某个接收者----该接收者将知道如何正确处理这个问题。

    异常情形是指阻止当前方法或作用域继续执行的问题。

    当抛出异常后,有几件事会随之发生。首先,同Java中其它对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序要么换一种方式运行,要么继续运行下去。


    捕获异常

    try {

        // Code that might generate execptions

    }


    异常处理程序

    try {

        // Code that might generate execptions

    } catch(Type1 id1) {

        // Handle execptions of Type1

    } catch (Type2 id2) {

        // Handle execptions of Type2

    } 

    // etc...


    异常说明

    异常说明使用了附加的关键字throws,后面接一个所有潜在异常类型的列表,所以方法定义可能看起来像这样:

    但是,要是这样写:

    void f() throws TooBig, TooSmall, DivZero {  // ...

    就表示此方法不会抛出任何异常


    异常基类Throwable的方法

    String getMessage();

    String getLocalizedMessage()

用来获取详细信息,或用本地语言表示的详细信息。

    String toString();

返回对Throwable的简单描述,要是有详细信息的话,也会把它包含在内。

    void printStackTrace()

    void printStackTrace(PrintStream)

    void printStackTrace(java.io.PrintWriter)

打印Throwable和Throwable的调用栈轨迹。调用栈显示了"把你待到异常抛出地点"的方法调用序列。其中第一个版本输出到标准错误,后两个版本允许选择要输出的流   

    Throwable fillInStackTrace()

用于在Throwable对象的内部记录栈帧的当前状态。这在程序重新抛出错误或异常时很有用 

    此外,也可以使用Throwable从其基类Object(也就是所有类的基类)继承的方法。对于异常来说,getClass()也许是各很好用的方法,它将返回一个表示此对象类型的对象。然后可以使用getName()方法查询这个Class对象包含包信息的名称,或者使用只产生类名称的getSimpleName()方法。


    栈轨迹

printStackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一桢。元素0是栈顶元素,并且是调用序列中的最后一个方法调用(这个Throwable被创建和抛出之处)。数组中的最后一个元素和栈底是调用序列中的第一个方法调用。


    重新抛出异常

如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息。要想更新这个信息,那么调用fillInStackTrace()方法,这将返回一个Throwable对象。它是通过把当前调用栈信息填入原来那么异常对象而建立的。

    

    异常链

常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,这被称为异常链。

Throwable的子类在构造器中都可以接受一个cause(因由)对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。

    

    Java标准异常

Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):Error用来表示编译时和系统错误(除特殊情况外,一般不用你关心)。Exception是可以被抛出的基本类型,在Java类库,用户方法以及运行时故障中都可能抛出Exception型异常。


    特例:RuntimeException

RuntimeException异常或从RuntimeException继承而来的异常,不需要在异常说明中声明方法将抛出RuntimeException类型的异常,它们也被称为"不受检查的异常"。


    使用finally进行清理

finally总会被执行,finally主要用来清理资源,包括:已经打开的文件或网络链接,在屏幕上画的图形,甚至可以是外部世界的某个开关。


    异常的限制

当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。


异常处理的一个重要原则是 "只有在你知道如何处理的情况下才捕获异常"。



    异常使用指南

应该在下列情况下使用异常:

1) 在恰当的级别处理问题。(在知道该如何处理的情况下才捕获异常。)

2) 解决问题并且重新调用产生异常的方法。

3) 进行少许修补,然后绕过异常发生的地方继续执行

4) 用别的数据进行计算,以代替方法预计会返回的值。

5) 把当前运行环境下能做的事情尽量昨晚,然后把相同的异常重抛到更高层。

6) 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层。

7) 终止程序

8) 进行简化。(如果你的异常模式使问题变得太复杂,那用起来会非常痛苦也很烦人)

9) 让类库和程序更安全。(这既是在为调试做短期投资,也是为程序的健壮性做长期投资)





本文出自 “小城运维” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1911237

《JAVA编程思想》学习笔记——第十二章 通过异常处理错误