目录
SimpleMappingExceptionResolver异常统一处理
在程序运行的过程中,难免会出现异常,如果我们没有做处理,那么前端页面显示的信息就会很不友好。在springMVC中提供了异常处理机制,通过注解就可以设置不同异常发生后,前端显示不同的信息。
下面代码就会产生一个异常
- @RequestMapping("/f1")
- public String f1() {
- int a = 1 / 0;
- return "success";
- }
看一下前端显示页面

下面就使用springmvc提供的异常处理来统一进行处理,需要写在当前的类里面
- //改注解value里面写上想要捕获的异常
- @ExceptionHandler({ArithmeticException.class})
- public String handleException(Exception e, HttpServletRequest request) {
- request.setAttribute("message", e.getMessage());
- return "fail_exception";
- }
- }
创建一个错误提示页面
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>异常title>
- head>
- <body>
- <h1>发生异常啦h1>
- <p>异常信息是:${message}p>
- body>
- html>
再次访问,查看信息

可以发现友好了很多。注意:@ExceptionHandleer只会捕获当前类里面发生的异常,异常信息可以通过参数来进行获取
上面的是局部异常,只能在一个类里面进行生效,下面来介绍全局异常。
- @ControllerAdvice
- public class GlobalException {
-
- //捕获类型转换异常
- @ExceptionHandler({NumberFormatException.class})
- public String f(Exception e, HttpServletRequest request) {
- request.setAttribute("message", e.getMessage());
- return "fail_exception";
- }
- }
全局异常我们使用@ControllerAdvice进行标识,然后里面的方法还是用@ExceptionHandler进行标识,在这里的异常处理会对所有的Handler都生效。下面代码会抛出一个异常,看是否能够处理
- @RequestMapping("/f2")
- public String f2() {
- int a = Integer.parseInt("abc");
- return "success";
- }
前端页面显示如下,可以进行捕获
有一点需要注意的是,异常捕获顺序是先在当前类里面标识@ExceptionHandler进行匹配,匹配不上再开始去@ControllerAdvice里面标识@ExceptionHandler进行匹配
我们还可以使用@ResponseStatus来进行自定义异常的捕获
- @ResponseStatus(reason = "年龄必须在18以上...", code = HttpStatus.INTERNAL_SERVER_ERROR)
- public class AgeException extends RuntimeException{
- }
上面代码我们定义了一个异常,使用@ResponseStatus进行标识,reason就是标识异常的原因,code就是要返回给前端的状态码。
下面创建一个handler进行测试
- @RequestMapping("/f3")
- public String f3() {
- if (1 > 0) {
- throw new AgeException();
- }
- return "success";
- }
前端页面显示如下

我们可以直接在配置文件中配置不同的异常要跳转的视图
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props>
- <prop key="java.lang.RuntimeException">fail_exceptionprop>
- <prop key="java.lang.ClassCastException">fail_exceptionprop>
- props>
- property>
- bean>
这样配置之后不同的异常将会跳转到不同的视图
异常处理的顺序就是 局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat默认异常处理机制
异常处理使用比较简单,如果想了解原理,自行debug即可