引言
在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统一异常处理。
了解异常处理的基本概念
在Java中,异常是程序运行过程中出现的问题,可以分为两大类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。受检异常需要程序员显式地进行处理,而非受检异常则不需要。为了提高代码的可读性和可维护性,我们通常会对异常进行统一的处理。
Spring Boot中的统一异常处理
Spring Boot提供了一个全局的异常处理器(GlobalExceptionHandler),可以捕获所有的异常,并进行统一的处理。要实现统一异常处理。
创建全局统一异常处理类
创建一个自定义的异常处理类,实现ControllerAdvice
和@RestControllerAdvice
注解。这个类将会成为全局的异常处理器。
@ControllerAdvice(basePackages="com.example.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public <T> Resp<T> exceptionHandler(Exception e){
//这里先判断拦截到的Exception是不是我们自定义的异常类型
if(e instanceof CustomException){
CustomException customException = (CustomException)e;
return Resp.error(customException.getCode(),customException.getMsg());
}
//如果拦截的异常不是我们自定义的异常(例如:数据库主键冲突)
return Resp.error(500,"服务器端异常");
}
}
创建自定义的异常类
首先,我们需要定义一些自定义的异常类,以便更好地区分各种异常情况。例如:
public class CustomException extends RuntimeException {
private int code = 500;
private String msg = "服务器异常";
public CustomException(CustomExceptionCodeMsg customExceptionCodeMsg) {
super();
this.code = customExceptionCodeMsg.getCode();
this.msg = customExceptionCodeMsg.getMsg();
}
public CustomException(int code, String msg) {
super();
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
创建统一信息返回类
public class Resp<T> {
//服务端返回的错误码
private int code = 200;
//服务端返回的错误信息
private String msg = "success";
//我们服务端返回的数据
private T data;
private Resp(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> Resp success(T data) {
Resp resp = new Resp(200, "success", data);
return resp;
}
public static <T> Resp success(String msg, T data) {
Resp resp = new Resp(200, msg, data);
return resp;
}
public static <T> Resp error(CustomExceptionCodeMsg customExceptionCodeMsg) {
Resp resp = new Resp(customExceptionCodeMsg.getCode(), customExceptionCodeMsg.getMsg(), null);
return resp;
}
public static <T> Resp error(int code, String msg) {
Resp resp = new Resp(code, msg, null);
return resp;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
}
创建一个枚举类型
public enum CustomExceptionCodeMsg {
INVALID_CODE(0000, "验证码无效"),
USERNAME_NOT_EXISTS(11111, "用户名不存在");
private int code;
private String msg;
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
CustomExceptionCodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
创建一个controller
@RestController
public class ExceptionController {
@GetMapping("/exception")
public Resp<String> exception(String name) {
if ("ok".equals(name)) {
return Resp.success("成功");
}
if ("err".equals(name)) {
//抛业务相关的异常
throw new CustomException(CustomExceptionCodeMsg.USERNAME_NOT_EXISTS);
}
if ("errcode".equals(name)) {
throw new CustomException(CustomExceptionCodeMsg.INVALID_CODE);
}
if ("0".equals(name)) {
int i = 1 / 0;
}
return Resp.success(name);
}
@GetMapping("/list")
public Resp<List> list() {
List<String> list = Arrays.asList("CSDN", "奇遇少年");
return Resp.success(list);
}
}
运行测试:
使用全局异常处理器的优势:
(1)提高代码的可读性和可维护性。通过将异常处理逻辑集中在一个地方,可以降低代码的复杂度,提高代码的可读性。同时,当需要修改异常处理逻辑时,只需要修改一个地方即可。
(2)提高系统的稳定性。通过全局的异常处理器,我们可以更好地定位和处理异常,避免因为未处理的异常导致系统崩溃。
(3)方便进行日志记录和监控。全局的异常处理器可以方便地记录异常信息,便于开发人员进行调试和排查问题。同时,也可以方便地将异常信息发送到监控系统,进行实时的监控和报警。
结语
通过本文的介绍,你已经学会了如何在Spring Boot中实现统一异常处理。通过定义自定义异常和创建全局异常处理器,我们能够更好地管理和处理应用中的各种异常情况。这不仅提高了代码的可读性和可维护性,还能够为用户提供更友好的错误信息。合理使用自定义异常,将有助于构建一个稳健的应用,为用户提供更加可靠的服务。