• SpringMVC的异常处理器是处理控制器方法执行过程出现的异常。
  • SpringMVC提供了一个处理异常的接口HandlerExceptionResolver
  • HandlerExceptionResolver接口有两个实现类:
    DefaultHandlerExceptionResolver实现类和SimpleMappingExceptionResolver实现类。
    DefaultHandlerExceptionResolver实现类是SpringMVC默认异常处理器。
    SimpleMappingExceptionResolver实现类是简易异常处理器,我们一般自定义配置异常处理策略就是使用该异常处理器。

基于xml文件配置异常处理器

配置异常处理器

<!-- 配置异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<!-- 配置异常视图的优先级 -->
	<property name="order" value="1"/>
	<!-- 配置异常逻辑视图映射:出现指定异常跳转到指定错误页面 -->
	<property name="exceptionMappings">
		<props>
			<!--
			 key设置要处理的异常,全类名
			 value设置出现该异常时要跳转的页面所对应的逻辑视图
			 -->
			<prop key="java.lang.ArithmeticException">error</prop>
			<prop key="java.lang.NullPointerException">error</prop>
		</props>
	</property>
	<!-- 设置异常属性:将异常信息共享到请求域中,浏览器可以获取请求域中的异常信息 -->
	<property name="exceptionAttribute" value="ex"/>
</bean>

创建视图

<a th:href="@{/test/error}">测试异常处理器</a><br/>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>错误</title>
</head>
<body>
<h1>error.html</h1>
<hr/>
<!-- 获取请求域中的异常信息 -->
<a th:text="${ex}"></a>
</body>
</html>

编写控制器方法

    @GetMapping("/test/error")
    public String testError() {
       //出现异常
        System.out.println(10/0);
        return "success";
    }

测试
发送访问/test/error控制器方法的请求,控制器方法执行过程中出现异常处理器中配置的异常策略,跳转到指定异常视图。

基于注解配置异常处理器

@ControllerAdvice //将当前类标识为异常处理的组件
public class ExceptionController {

    //@ExceptionHandler用于设置所标识方法处理的异常
    //ex表示当前请求处理中出现的异常对象
    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView handleArithmeticException(Exception ex) {
        ModelAndView mad = new ModelAndView();
        mad.addObject("ex",ex);
        mad.setViewName("error");
        return mad;
    }

    @ExceptionHandler(value = {NullPointerException.class})
    public String handleNullPointerException(Exception ex,Model model) {
        model.addAttribute("ex",ex);
        return "error";
    }
}