JEE开发异常处理

Wesley13
• 阅读 354

       在Java开发中,到处可见Exception或者它的子类。如何在一个已有的框架中或者自己的项目中利用好异常,而不让异常漫天飞,需要开发的积累和总结,这篇日志就为这个目的总结几年来的开发对异常使用总结吧。

       首先认识Java异常体系结构,Java中使用Throwable作为所有的异常父类,下面有两大子类Error和Exception。所有的异常分为两种类型;一类为Checked异常,另一类为Unchecked异常。顾名思义,Checked异常就是需要程序代码必须捕获处理的,否则编译器就不让编译通过。Unchecked是不要求程序代码捕获处理的。其中继承Checked异常类的都为Checked类型异常,继承Unchecked类型的异常都为Unchecked类型异常。回过头来看Throwable的子类异常划分。其中Throwable直接子类Error和间接之类RuntimeException(Exception直接子类)为Unchecked异常,而其他的为Checked异常。下面分别描述各种异常的特点(摘录其他文档)。

Error系

      Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系

Exception体系包括RuntimeException体系和非RuntimeException体系     

      RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理 RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界 来避免数组越界访问异常。
     其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

      因为很多API和框架,在接口上面申明Checked异常,所以我自己的代码中到处是Catch,而且很多Catch到的异常是没法处理掉的,假如我一层一层的抛出去,这样就影响性能,污染接口(比如MVC的控制层不可能去处理你的JDBC链接异常),而且上层用户代码也不见得可以处理。而且也影响美观,增加各层代码复杂度。后来我有一段时间都是不管三七二十一,大部分异常我都使用Unchecked异常包装后抛出去。但是Java规范推荐的是使用Checked异常,这点我现在都觉得值得商榷。再后来,在使用Unchecked异常时也觉得有时候应该让上层的代码处理这个异常,获取出现错误的信息。(比如:用户调用接口,本因该是正数而不是负数,不能只是返回值说处理失败),而且异常最好是有分类,比如JDBC连接异常,我们不能处理就抱装成系统级别的Unchecked异常,如果是参数错误这样的异常,我们定义为系统级别的Checked,如果是用户密码错误这种异常,我们定义为业务级别的Checked异常。我们经常在业务方法上面定义业务基本的Checked异常。

       我们经常在处理异常的时候都伴随着记录异常日志信息。日志信息如果记录比较好,我经常看到,开发人员为了记录住全部异常信息都是Catch的时候都是Log.warn("某某",cause),弄等日志信息重复记录,因为你记录后抛出去又被catch一次,这里我自己常用的一个原则,就是那里发生异常那里记录我catch项目组其他人的接口的异常时我不记录,我要么处理,要么抛出去(这里可能没说清楚,就是离发生异常就近原则;比如我的持久层就是包装好jdbc异常。记录好日志)。

       下面总结几条我个人异常设计原则或者编码原则

  • 能够处理的异常坚决使用Checked异常包装

  • 不能处理、不可恢、复严重错位的异常使用Unchecked包装,接口上面说明可能的Unchecked异常,让调用者知道

  • 包装的异常信息栈要连续,能够被追踪到异常发生地(比如new CustomerException("某某", cause),不要使用 new CustomerException("某某"))

  • 包装后的异常要分业务异常或者系统异常而且必须要有一定的业务或者系统含义

  • 利用JDK中已有的异常,不重复造车

  • 记录异常日志时,就近异常发生地记录,不要重复记录,当然如果是可以处理的异常就不要记录日志,比如用户输入的数据有问题不能类型转换。就没必要记录,你可以处理——让用户重新输入一遍

  • 程序的最上层要对unchecked异常统一处理,不要暴露给用户

      针对JEE通常用的三层架构,dao层,基本会在每个接口后面声明Unchecked异常。service层会在大部分接口后面声明checked异常。action会校验用户输入参数、并把业务异常信息转换用户看得懂的消息。

初次在oschina上发帖,大家多给点建议、拍砖,但不要骂人

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
2个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
Jacquelyn38 Jacquelyn38
1年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
1年前
Java中的异常
异常的概述异常就是不正常的意思,Java语言中主要指程序在运行阶段产生的错误Throwable(可抛出、可扔出的)Java.lang.Throwable类是Java程序所有错误或异常的超类主要有两个子类:  Error:主要描述比较严重的错误,无法通过编程来解决的重大的错误  Exception:主要描述比较轻量
Wesley13 Wesley13
1年前
03.Android崩溃Crash库之ExceptionHandler分析
目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃
Wesley13 Wesley13
1年前
Java 的Throwable、error、exception的区别
1.  什么是异常?异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用(NullPointerException)、数组下标越界(IndexOutOfBoundsException)、内存溢出错误等。Throwable类是Java语言中所有错误或异常的超类。有两个重要的子类:Exception(异常)和Error(错误),
Wesley13 Wesley13
1年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Wesley13 Wesley13
1年前
java Exception和Error的区别
Exception子类下面的另一部分子类对应于Java程序中的非运行时异常的处理,这些异常也称为显式异常。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。常见的异常有:ArithmeticException——由于除数为0引起的异常;ArrayStoreExcept
Wesley13 Wesley13
1年前
JAVA学习笔记 之 异常
异常的概述代码在运行时期发生的问题就称之为异常。在java中,异常被封装成为了一个类,当程序出现了异常类中的问题时,异常的信息(如位置和原因)就会被抛出。在java中用Exception来描述异常,publicclassExceptionextendsThrowable则是异常的继承体系。 Throwable是所有错误或异常的