博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异常处理的设计与重构
阅读量:6347 次
发布时间:2019-06-22

本文共 2714 字,大约阅读时间需要 9 分钟。

hot3.png

异常处理(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的链接很能说明问题。

 

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

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

学习
  • 参考 ,查看对 finally 语句块的描述。
  • 参考 ,查看 Java 语言规范第四版中对 finally 语句块的解释。
  • 参考 ,查看 Java 语言规范第三版中对 finally 语句块执行流程的具体描述。
  • 参考 ,查看 Java 虚拟机是如何来编译 finally 语句块的知识。
  • 查看文章 ,了解更多关于 Java 中 finally 语句块的分析。
  • 查看文章 ,了解更多关于 Java 中 finally 语句块的分析。
  • :这里有数百篇关于 Java 编程各个方面的文章。

转载于:https://my.oschina.net/ray1421/blog/628877

你可能感兴趣的文章
groovy-语句
查看>>
VIM寄存器使用
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>
Silverlight 5 beta新特性探索系列:10.浏览器模式下内嵌HTML+浏览器模式下创建txt文本文件...
查看>>
YourSQLDba 配置——修改备份路径
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
网易音乐版轮播-react组件版本
查看>>
ES6 - 函数与剩余运算符
查看>>
你对position了解有多深?看完这2道有意思的题你就有底了...
查看>>
WebSocket跨域问题解决
查看>>
ECMAScript6基本介绍
查看>>
世界经济论坛发布关于区块链网络安全的报告
查看>>
巨杉数据库加入CNCF云原生应用计算基金会,共建开源技术生态
查看>>
Ubuntu 16.04安装Nginx
查看>>
从 JS 编译原理到作用域(链)及闭包
查看>>
flutter 教程(一)flutter介绍
查看>>
CSS面试题目及答案
查看>>