异常处理的设计与重构

异常处理(exception handling):负责处理组件缺陷(可预期的错误状况)。

容错设计(fault-tolerant programming):负责处理设计缺陷(不可预期的错误状况)。

由于程序语言主只提供了异常处理机制,并没有特别帮容错设计安排额外的机制,因此无论是上述分类中的异常处理或容错编程,在实现层面都可以采用程序语言的异常处理机制。

  • 容错设计通常是使用在需要非常高强健度等级的应用系统,所以具备容错功能的系统开发成本比一般商用系统高出许多。

缺陷避免  fault prevention

缺陷容忍  fault tolerance   :当检测到缺陷时,切换到备份路径上。

缺陷移除 fault removal   (tip: remove  n. 距离;差距;间距,****注意并没有去除的意思)

缺陷预测 fault forcasting

关于Java中的异常类

所有“异常”类的顶层类是Throwable,

-Throwable

--Exception

        --IOException

        --SQLException

        --RuntimeException

                --NullPointerException

                --IndexOutofBoundsException

--Error

上面红色加亮的部分表示的是未查异常,又称运行时异常。而Exception下面,不属于RuntimeException的异常类型则为检查型异常。

在某些特殊情况下,如果要连错误都一起捕获,则可以用catch(Throwable e)的方式。

************************Java中try catch finally 语句块的一些问题*********

finally :try…… catch ……finally语句块中最后的finally 块是用来释放在try块里面所使用的资源的,不管try块中是否发生异常,只要写了finally 块,程序的执行顺序最后一定会跑到这里面。tip吐舌笑脸吐舌笑脸:就算是直接在try 或是catch里面使用return 指令,finally 块也还是会被执行(tips吐舌笑脸:因为finally 虽然位置在return 后面,但是java虚拟机处理时,finally语句是在return语句之前执行的。具体见本文末尾所附文章)。但是请注意,只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。

世上无绝对,是规则就会有异常。当JVM执行到try块或是catch块里面的代码时,但是JVM自己本身却被终止执行时,finally 块便不会被执行。

如下面的例子所示:

public static void main(String[] args){

          try{

             System.out.println(“execute try block”);

            System.exit(0);

          }

          finally{

             System.out.println(“execute finally block”);

           } 

}       //因为在try语句块中直接调用System.exit(0)终止了整个程序的执行,所以finally块不会被执行。

******************************************

到了Java SE7之后,多了几个新的功能,先来看看第一个新功能multi-catch exceptions,它可以在一个catch块里面同时捕获多个异常,如下面所示:

try{

}catch(ParseException | IOException e){

}

第二个新功能try-with-resources是Java从C#那里借用的,在JAVA SE7之前,释放资源的程序要写在finally 块里。但SE7之后,可以把产生资源的程序代码写在try语句块中,在离开整个try语句块之前,JVM会自动调用相应对象的close函数进行清理。   tips吐舌笑脸:如果想要应用这个新的功能,即让try语句块后自动清理资源,就必须让该类实现AutoCloseable这个Java SE7之后才新增的接口。该接口很简单,只有一个函数:

void close() throws Exception

注:第二个功能不建议使用。

第三个功能即重丢异常(rethrow)的改变。

在SE7之前,一个IOException被catch(Exception e)捕获后重新以Exception e抛出,编译程序会认为被捕获到的异常属于Exception.既然要把它往外丢,就应该在这个函数接口上声明throws Exception而非IOExcetion.

到了SE7之后,编译程序就变得聪明了,已经会自动判断catch(Exception e)所捕获到的异常类型,其实是try块里面丢出来的IOException,这样程序就可以编译通过了。

总结

没想到吧!一个小小的、看似简单的 finally 语句块背后居然隐藏了这么多玄机。看来,我们平时还是应该认真的阅读 Java 相关的基础文档,比如:Java 语言规范、Java 虚拟机规范等,很多棘手的问题都可以从中得到答案。只有真正的吃透了基础知识,才能达到运用自如的境界!

关于 Java 中 finally 语句块的深度辨析  (其实关于finally语句块的水很深,下面的这个IBM的链接很能说明问题。

http://www.ibm.com/developerworks/cn/java/j-lo-finally/

 

没有 catch 语句,哪来的异常处理呢?我觉得这是一个好问题,其实,即使没有 catch 语句,Java 编译器编译出的字节码中还是有默认的异常处理的,别忘了,除了需要捕获的异常,还可能有不需捕获的异常(如:RunTimeException 和 Error)。

凡是java的问题,最后都从官方的参考文档中找寻答案。  或者通过分析编译后的字节码来查找问题。

学习
  • 参考 The Java Tutorials,查看对 finally 语句块的描述。
  • 参考 《The Java Programming Language, Fourth Edition》,查看 Java 语言规范第四版中对 finally 语句块的解释。
  • 参考 《The Java Language Specification, Third Edition》,查看 Java 语言规范第三版中对 finally 语句块执行流程的具体描述。
  • 参考 《The Java Virtual Machine Specification, Second Edition》,查看 Java 虚拟机是如何来编译 finally 语句块的知识。
  • 查看文章 Java 的异常处理机制(try … catch … finally),了解更多关于 Java 中 finally 语句块的分析。
  • 查看文章 Java 中 finally 的辨析,了解更多关于 Java 中 finally 语句块的分析。
  • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。

你可能感兴趣的:(异常处理的设计与重构)