异常抛出小结(一)
返回主页
关于异常抛出,简单而言有“一张图五个字”之说。
"一张图"即下图
"五个字"即
- try
- catch
- finally
- throw
- throws
异常包括系统级的ERROR,以及Exception
程序员只需要考虑Exception即可,至于ERROR,那是Oracle的事。
Q1:当异常抛出时发生了什么?
A:当前环境下无法获得必要的信息来解决问题,而你所能做的就是 从当前环境跳出,并且把问题提交给上一级的环境,这就是抛出异常时所发生的事情。
Q2:抛出异常后
- 使用new在堆上创建异常对象
- 当前执行路径被终止
- 从当前环境中弹出对异常对象的引用
- 恰当的异常处理程序
我们可以将异常看作是一种内建的恢复(undo)系统
- 如果程序某部分失败了,则异常将“恢复”到某个一已知的稳定点上。
- 异常允许我们(如果没有其他手段)强制程序停止运行,并且告诉我们出现了什么问题,或者(理想情况下)强制程序处理问题,并且返回到稳定的状态。
Q:关于异常的返回地点?
- 异常返回“地点”与普通方法调用的返回地点 完全不同;
- 异常将在一个恰当的异常处理程序中得到解决。它的位置可能离异常被抛出的地方很远,也可能会跨越 方法调用栈的 许多层次;
- 对于抛出任意类型的 Throwable对象,它是异常类型的根类。
关于catch与switch的区别
只有匹配的catch子句才能得到执行,而switch需要break的配合,否则就会执行下去直到结束
关于“终止模型”
即:一旦异常被抛出,就表明 错误无法挽回,不能回来继续执行
关于“恢复模型”
即: 1. 异常处理程序作用是 修正错误; 2. 重新尝试调用出问题的方法,并认为第二次可以成功; 3. 关键在于:在遇见错误时不能抛出异常,而是调用方法来修正该错误;或者 把try块放在while循环中,不断进入try块中,直到得到满意的结果。
注意【CAUTION】
恢复模式固然很好,但是这会产生很多非通用性的代码,导致了整个程序 耦合性增加,使得程式尤其是大型程式变得难以维护。
因此,程序员可以创建自定义异常
最简单的方法是: 让编译器为你产生默认的构造器
Q:如何捕获所有异常?
A:通过捕获异常类型的基类 Exception就可以做到: “只写一个异常处理程序来捕获所有类型的异常” 但是 最好在catch的结尾使用,防止抢先捕获行为的发生。
因此,好的办法就是从低级到高级去书写catch块,反过来会提示重复捕获。
小结:
本文总结了一些异常捕获的问题以及相关的处理技巧,后续会继续就捕获异常的具体情况进行分析。