异常是程序运行过程当中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。java
Thorwable
类全部异常和错误的超类,有两个子类Error
和Exception
,分别表示错误和异常。
其中异常类Exception
又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)
和检查异常(Checked Exception)。spring
Error
是程序没法处理的错误,好比OutOfMemoryError
、ThreadDeath
等。这些异常发生时,Java虚拟机(JVM)通常会选择线程终止。编程
Exception
是程序自己能够处理的异常,这种异常分两大类,运行时异常和非运行时异常。程序中应当尽量去处理这些异常。架构
运行时异常都是RuntimeException类及其子类异常,如框架
这些异常是不检查异常(UncheckedException),程序中能够选择捕获处理,也能够不处理。这些异常通常是由程序逻辑错误引发的,程序应该从逻辑角度尽量避免这类异常的发生。编译是能够经过的。jvm
非运行时异常是除RuntimeException之外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,若是不处理,程序就不能编译经过。如IOException、SQLException等以及用户自定义的Exception异常,通常状况下不自定义检查异常。性能
Java异常的捕获和处理是一个不容易把握的事情,若是处理不当,不但会让程序代码的可读性大大下降,并且致使系统性能低下,甚至引起一些难以发现的错误。.net
Java异常处理涉及到五个关键字,分别是:try
、catch
、finally
、throw
、throws
。线程
try
、catch
、finally
三个语句块均不能单独使用,三者能够组成 try...catch...finally
、try...catch
、try...finally
三种结构,catch语句能够有一个或多个,finally语句最多一个。throw
关键字是用于方法体内部,用来抛出一个Throwable
类型的异常。设计
当抛出的是运行时异常,程序能够选择处理和不处理
public static void main(String[] args) { try { FileReader file = new FileReader("d:/entitycode"); } catch (FileNotFoundException e) { e.printStackTrace(); throw new RuntimeException(); } }
抛出的是非运行时异常时,程序必需要处理,能够继续往外抛,或者捕获
public static void main(String[] args) throws FileNotFoundException { try { FileReader file = new FileReader("d:/entitycode"); } catch (FileNotFoundException e) { e.printStackTrace(); throw new FileNotFoundException(); } }
getCause()
:返回抛出异常的缘由。若是 cause 不存在或未知,则返回 null。getMessage()
:返回异常的消息信息。printStackTrace()
:对象的堆栈跟踪输出至错误输出流,做为字段 System.err 的值。Exception
通常分为Checked异常
和Runtime异常
,全部RuntimeException
类及其子类的实例被称为Runtime异常
,不属于该范畴的异常则被称为CheckedException
。对非检查型类异常能够不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。因此必须在service捕获异常,而后再次抛出,这样事务方才起效。
在spring的事务管理环境下,使用unckeckedException能够极大地简化异常的处理,只须要在事务层声明可能抛出的异常(这里的异常能够是自定义的unckecked exception体系),在全部的中间层都只是须要简单throws便可,不须要捕捉和处理,直接到最高层,好比UI层再进行异常的捕捉和处理
在service类前加上@Transactional,声明这个service全部方法须要事务管理。每个业务方法开始时都会打开一个事务。
Spring默认状况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked若是遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不须要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
一个统一的异常层次结构对于提供服务抽象是必需的。 最重要的就是org.springframework.dao.DataAccessException以及其子类了。 须要强调的是Spring的异常机制重点在于应用编程模型。与SqlException和其余数据存取API不一样的是: Spring的异常机制是为了让开发者使用最少, 最清晰的代码。DataAccessException和其余底层异常都是非检查性异常(unchecked exception)。 spring的原则之一就是基层异常就应该是非检查性异常. 缘由以下: