SpringMVC之全局异常的处理
1 注解方式
1.1 准备工作
1.1.1 导入springmvc依赖和lombok依赖
org.springframeworkspring-webmvc5.3.22org.projectlomboklombok1.18.24
1.1.2 创建一个自定义消息通知工具类
package com.util;
import lombok.Data;
//自定义响应类型
@Data
public class Results {/*状态码信息数据*/private int code;//状态码private String msg;//信息private Object data;//数据public Results(int code, String msg) {this.code = code;this.msg = msg;}public Results(int code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public static Results ok(){return new Results(200, "success");}/*自定义消息*/public static Results ok(String msg){return new Results(200, msg);}public static Results ok(String msg,Object data){return new Results(200, msg,data);}/*自己命名的状态码*/public static Results err(String msg){return new Results(500,msg);}
}
1.2 空指针异常
1.2.1 示例代码
a 访问地址时的代码
@RequestMapping("err1")public String a1(){String s=null;System.out.println("测试进入了没有???");System.out.println(s.indexOf("abc"));return "操作成功";}
b 异常处理时的代码
package com.controller;
import com.util.Results;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(NullPointerException.class)public Results ex1(NullPointerException ex){//只要出现空指针异常就进入这里ex.printStackTrace();//控制台打印异常 便于观察和调试return Results.err("空指针异常");}
}
1.2.2 代码分析
因为配置SpringMVC的时候只扫描了controller包,因此这个异常处理类是需要放在Controller类这个里面的
通过@RestControllerAdvice和@ExceptionHandler给指定的异常配备了处理方法,那么只要在访问过程中出现了该异常,那么就会自动进入该方法
1.2.3 代码运行截图
a 前台运行截图

b 控制台运行截图

1.3 数组下标越界
1.3.1 示例代码
a 访问地址时的代码
@RequestMapping("err2")public String a2(){String[] arr={};System.out.println(arr[100]);return "操作成功";}
b 异常处理时的代码
package com.controller;
import com.util.Results;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(ArrayIndexOutOfBoundsException.class)public Results ex2(ArrayIndexOutOfBoundsException ex){//只要出现数组下标越界异常就进入这里ex.printStackTrace();//控制台打印异常 便于观察和调试return Results.err("请求的下标越界 越界信息"+ex.getMessage());}
}
1.3.2 代码分析
a 需要对什么异常信息进行处理,就可以通过 @ExceptionHandler注解将对应异常类的.class作为参数传入进去
b 因为我们是要进行bug的修复,所以可以通过 ex.printStackTrace()的方式在控制台打印错误信息,方便我们进行后续的调试
1.3.3 代码运行截图
a 前台运行截图

b 控制台运行截图

1.4 其他异常
1.4.1 示例代码
a 访问地址时的代码
@RequestMapping("err3")public String a3(){System.out.println(1/0);return "操作成功";}
b 异常处理时的代码
package com.controller;
import com.util.Results;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(Exception.class)public Results ex2(Exception ex){//只要出现任何异常就进入这里ex.printStackTrace();//控制台打印异常 便于观察和调试return Results.err("服务器报错 信息"+ex.getMessage());}
}
1.4.2 代码分析
配置了Exception类,那么所有出现的异常都能进入该方法,保证呢对所有的错误进行精准的调试
1.4.3 代码运行截图
a 前台运行截图

b 控制台运行截图

2 xml方式
2.1 准备工作
2.1.1 WEB-INF文件夹下创建空指针处理页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
Title
空指针异常
<%="错误信息:"+exception.getMessage()%>
2.1.2 WEB-INF文件夹下创建数组下标越界异常处理界面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
Title
数组下标越界异常
<%="错误信息:"+exception.getMessage()%>
2.1.3 WEB-INF文件夹下创建其他异常处理界面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
Title
服务器异常
<%="错误信息:"+exception.getMessage()%>
2.2 配置springMVC主配置文件
WEB-INF/kzzWEB-INF/szyj
2.3 空指针异常
2.3.1 示例代码
@RequestMapping("err1")
public String a1(){String s=null;System.out.println("测试进入了没有???");System.out.println(s.indexOf("abc"));return "操作成功";
}
2.3.2 代码运行截图

2.4 数组下标越界异常
2.4.1 示例代码
@RequestMapping("err2")public String a2(){String[] arr={};System.out.println(arr[100]);return "操作成功";}
2.4.2 代码运行截图

2.5 除上述两种异常之外的异常
2.5.1 示例代码
@RequestMapping("err3")public String a3(){System.out.println(1/0);return "操作成功";}
2.5.2 代码运行截图

3 总结
一般来说,配置全局异常处理的话,采用的是注解方式居多,因为它可以很灵活的去处理出现的异常