SpringMVC之全局异常的处理
1 注解方式
1.1 准备工作
1.1.1 导入springmvc依赖和lombok依赖
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.3.22version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
dependencies>
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主配置文件
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="WEB-INF/err">property>
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">WEB-INF/kzzprop>
<prop key="java.lang.ArrayIndexOutOfBoundsException">WEB-INF/szyjprop>
props>
property>
bean>
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 总结
一般来说,配置全局异常处理的话,采用的是注解方式居多,因为它可以很灵活的去处理出现的异常