java 异常小结

本篇不打算冗长介绍各类异常,只写出通用的应该遵循的异常处理规范(我的理解,若有错误欢迎指正)java

 

1. 检查异常(checked exception),一般见到的有SQLException,IOException,InterruptedException,ConnectTimeOutException,ClassNotFoundException等等。这些异常每每是因为数据库,网络和资源问题致使的,不是程序自己正常运行的状况。这些异常被认为是能够恢复的,好比网络异常能够经过重试几回有可能就解决了。这类异常要求程序员必须捕获并做处理,程序员的具体处理仍是要根据业务状况而定。
  非检查异常(unchecked exception),常见的有NullPointerExceprion,OutOfBoundsException,IllegalArgumentExcetion,NumberFormatException等(通常这类异常继承自RuntimeException),这些通常是程序内部的,因为数据格式的问题产生的非正常状况,理论上是不该该发生的,而咱们也的确能够经过某种方式避免一些非检查异常(数组长度判断,非空判断等)。非检查异常不要求程序员必须捕获,有时候函数头会指明抛出的非检查异常(可是不要求必定捕获),有时候只在api的注释里面说明可能抛出的异常。这个是api设计的不一致问题。
  java区分这两种异常,在一些时候显得没那么必要,检查异常要求强制try-catch,以及直接在函数头上声明出来,会让代码很难看。所以通常项目中使用的都是非检查异常,有些底层的检查异常最后也会被转译为非检查异常。非检查异常不会污染接口,可是仍是须要处理。
 
2. 不要使用异常作流程控制
    好比不对除数作判断,当发生异常时,再得出除数等于0或返回失败。或者当某段代码异常了表示进入某个分支,没有异常就走另一分支。或者经过异常跳出循环。由于异常的try-catch是消耗资源的作法,异常针对的是非正常状况,不该该与正常的业务代码混用。
 
3. 异常若是能处理就内部处理了,若是不能处理就抛给调用者,而不该该catch了异常,而后打印了堆栈信息就完了。
    异常能处理,好比发生了检查异常,咱们能够重试屡次,若是屡次仍然失败,就抛出;或者说一段代码异常,没有更高一级的调用者可以处理了,再抛出就抛给虚拟机了,此时要处理它;或者说某段代码异常就能够认定这个任务失败了,这时就能够处理之作状态变动。
    catch了异常不处理,只打印,致使的问题就是调用者正常调用了这个方法,也正常返回了,以为应该没有问题了,可是实际上方法内部异常了。这时候调用者拿到错误的数据就会产生很是严重的后果。虽然有日志打印,可是实际上业务上认为成功了,除非任务失败,不然若是没有人检查日志就不会有人发现这段错误。
  
4. 保留异常现场
    异常发生时,若是肯定要catch处理它,除了记录堆栈信息(使用日志的项目中,须要用logger记录,而不要e.printStackTrace(),此外,我见过只记录e.getMessage()的,发生错误以后,我只能看到一个空指针异常,而看不到哪一行空指针了),还要保留异常现场。也就是说发生异常时正在作什么操做,操做的输入参数输出参数是怎样的(日志格式强烈建议规范化,否则不统一的格式看起来很难受)。方便从参数中发现异常缘由,排查问题。
 
5. 不要有过大的try块
    try-catch是比较消耗资源的作法(不清楚JVM的实现,有机会再研究,可是直观地看,程序要保留异常堆栈信息,监控代码是否异常,应该不是轻松的事情),
    因此只针对可能抛出异常的代码try-catch,try-catch中不该该有太多无关操做。好比异常作状态修改,彻底能够用一个boolean值在catch完以后再作记录。
 
6. 不要从头至尾只用一种异常
    不要只用exception或者RuntimeException处理全部的异常。程序当中应该区分不一样模块和不一样层的异常,好比系统异常业务异常,dao异常service异常,方便出错的时候定位问题。另外,对异常可使用编码来记录异常类型和异常说明。这样能够用一个类/配置文件,来对异常进行管理。若是要修改异常的表示方式或者文字说明,也不用每一个类里面乱找。将一些一些api异常或者底层的异常,转移为业务异常(catch以后new一个业务异常),也是常常有的。
 
7. 对try块中申请的资源,应该要在finally中释放掉,java7提供了try(声明资源语句),但总之资源都应该保证退出方法时被释放。
 
8. 记住异常是非正常状况,若是可以避免就尽可能避免,异常只是一种保障机制,不表明咱们能够无视业务逻辑和算法,随便写,写完catch就好了。
   对于一些能够规避的异常(空指针,非法数字格式,下标越界等),能够经过程序判断来避免。对于web的控制层异常,须要转译异常,跳转到错误页面,或者是提示前台【内部错误】,不要将堆栈信息也显示到前台。
 
---------------------------以上----------------------------
相关文章
相关标签/搜索