SpringMVC在处理请求过程中出现的异常可以交由异常处理器进行处理,而自定义异常处理器可以实现一个系统的异常处理逻辑。
异常处理思路
我们知道,系统中出现的异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试,通过手段来减少运行时异常的发生。系统中的dao、service、controller这些层出现异常都可以通过throws Exception向上抛出异常,最后由SpringMVC前端控制器交由异常处理器进行异常处理,SpringMVC提供全局异常处理器(一个系统应只有一个全局异常处理器)进行统一异常处理,如下图所示。
明白了SpringMVC中的异常处理机制,下面就开始讲解SpringMVC中的异常处理。
全局异常处理器案例
下面我会编写一个全局异常处理器,来处理所有没有处理过的运行时异常,这样可以更加友好地给用户提示信息。
自定义异常类
为了区别不同的异常,通常要根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao这些层抛出此类异常,那么说明这就是系统预期处理的异常。我们可在工程的com.meimeixia.springmvc.exception包下创建一个自定义异常类,例如MyException.java。
package com.meimeixia.springmvc.exception;
/**
* 自定义异常
* @author liayun
*
*/
public class MyException extends Exception {
private String msg;
public MyException() {
super();
}
public MyException(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
自定义异常处理器
全局异常处理器处理异常的思路如下:
- 解析出异常类型;
- 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示;
- 如果该异常类型不是系统自定义的异常,那么应取出错误的堆栈信息,并记录下来,在错误页面展示。
SpringMVC提供了一个HandlerExceptionResolver接口,自定义全局异常处理器