异常抛出小结(一)

                                                                           返回主页

关于异常抛出,简单而言有“一张图五个字”之说。

"一张图"即下图

"五个字"即

异常包括系统级的ERROR,以及Exception

程序员只需要考虑Exception即可,至于ERROR,那是Oracle的事。

Q1:当异常抛出时发生了什么?

A:当前环境下无法获得必要的信息来解决问题,而你所能做的就是 从当前环境跳出,并且把问题提交给上一级的环境,这就是抛出异常时所发生的事情。

Q2:抛出异常后

  1. 使用new在堆上创建异常对象
  2. 当前执行路径被终止
  3. 从当前环境中弹出对异常对象的引用
  4. 恰当的异常处理程序

我们可以将异常看作是一种内建的恢复(undo)系统

  1. 如果程序某部分失败了,则异常将“恢复”到某个一已知的稳定点上。
  2. 异常允许我们(如果没有其他手段)强制程序停止运行,并且告诉我们出现了什么问题,或者(理想情况下)强制程序处理问题,并且返回到稳定的状态。

Q:关于异常的返回地点?

  1. 异常返回“地点”与普通方法调用的返回地点 完全不同
  2. 异常将在一个恰当的异常处理程序中得到解决。它的位置可能离异常被抛出的地方很远,也可能会跨越 方法调用栈许多层次
  3. 对于抛出任意类型的 Throwable对象,它是异常类型的根类。

关于catch与switch的区别

只有匹配的catch子句才能得到执行,而switch需要break的配合,否则就会执行下去直到结束

关于“终止模型”

即:一旦异常被抛出,就表明 错误无法挽回,不能回来继续执行

关于“恢复模型”

即: 1. 异常处理程序作用是 修正错误; 2. 重新尝试调用出问题的方法,并认为第二次可以成功; 3. 关键在于:在遇见错误时不能抛出异常,而是调用方法来修正该错误;或者 把try块放在while循环中,不断进入try块中,直到得到满意的结果。

注意【CAUTION】

恢复模式固然很好,但是这会产生很多非通用性的代码,导致了整个程序 耦合性增加,使得程式尤其是大型程式变得难以维护。

因此,程序员可以创建自定义异常

最简单的方法是: 让编译器为你产生默认的构造器

Q:如何捕获所有异常?

A:通过捕获异常类型的基类 Exception就可以做到: “只写一个异常处理程序来捕获所有类型的异常” 但是 最好在catch的结尾使用,防止抢先捕获行为的发生。

因此,好的办法就是从低级到高级去书写catch块,反过来会提示重复捕获。

小结:

本文总结了一些异常捕获的问题以及相关的处理技巧,后续会继续就捕获异常的具体情况进行分析。

参考资料:《Thinking in Java》