一、异常概述
异常处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++、C#、Ruby、Python等,大都提供了异常处理机制。增加了异常处理机制后的程序有更好的容错性,更加健壮。
二、传统错误处理的缺陷
–无法穷举所有异常情况:因为人类知识的限制,异常情况总比可以考虑到的情况多,总有“漏网之鱼”的异常情况,所以程序总是不够健壮。
–错误处理代码和业务实现代码混杂:这种错误处理和业务实现混杂的代码严重影响程序的可读性,会增加程序维护的难度。
三、java的异常体系
四、异常信息
所有异常对象都包含了如下几个常用方法:
–getMessage():返回该异常的详细描述字符串。
–printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
–printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。
–getStackTrace():返回该异常的跟踪栈信息。
五、finally
try { 需要检测的代码; } catch(异常类 变量) { 异常处理代码; } finally { 一定会执行的代码; }
finally中的代码一定会执行,所以可以使用finally回收资源。
程序在try块里打开了一些物理资源(例如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。
为了保证一定能回收try块中打开的物理资源,异常处理机制提供了finally块。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,finally块总会被执行。
注:Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0)。
六、多异常捕捉
在Java 7以前,每个catch块只能捕捉一个异常。但从Java 7开始,一个catch块可以捕捉多个异常。
catch(异常1 | 异常 2 | 异常3 ex) { }
多个异常之间用竖线隔开。
多异常捕捉时,异常变量之前有隐式final修饰。
七、异常跟踪栈
异常对象的printStackTrace方法用于打印异常的跟踪栈信息,根据printStackTrace方法的输出结果,我们可以找到异常的源头,并跟踪到异常一路触发的过程。
面向对象的应用程序运行时,经常会发生一系列方法调用,从而形成“方法调用栈”,异常的传播则与相反:只要异常没有被完全捕获(包括异常没有被捕获,或异常被处理后重新抛出了新异常),异常从发生异常的方法逐渐向外传播,首先传给该方法的调用者,该方法调用者再次创给其调用者……直至最后传到 main方法,如果main方法依然没有处理该异常,JVM会中止该程序,并打印异常的跟踪栈信息。
八、异常处理规则
不要过度使用异常
不要使用过于庞大的try块
避免使用Catch All语句
不要忽略捕获到异常