平台推广网站,黔西南做网站的有几家,wordpress模板最多使用,做网站可以不做后端吗说明#xff1a;在完整的项目结构中#xff0c;我们通常会创建一个自定义的异常处理机制#xff0c;在系统可能出现异常的地方手动抛出这些异常#xff0c;可以快速定位到异常代码片段#xff0c;提供项目的可维护性。
本文介绍在SpringBoot项目中#xff0c;搭建一套自…说明在完整的项目结构中我们通常会创建一个自定义的异常处理机制在系统可能出现异常的地方手动抛出这些异常可以快速定位到异常代码片段提供项目的可维护性。
本文介绍在SpringBoot项目中搭建一套自定义异常处理机制。
统一响应结果
首先创建一个统一响应结果类如下用于统一后台的返回结果请求成功返回数据请求失败返回错误信息
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 后端统一返回结果*/
Data
Builder
AllArgsConstructor
NoArgsConstructor
public class ResultT implements Serializable {private static final long serialVersionUID 1L;/*** 编码1成功 0和其他数字为失败*/private Integer code;/*** 错误信息*/private String msg;/*** 数据*/private T data;/*** 成功并返回** param T* return*/public static T ResultT success() {ResultT result new ResultT();result.code 1;return result;}/*** 成功并返回数据** param object* param T* return*/public static T ResultT success(T object) {ResultT result new ResultT();result.data object;result.code 1;return result;}/*** 失败并返回信息** param msg* param T* return*/public static T ResultT error(String msg) {Result result new Result();result.msg msg;result.code 0;return result;}
}然后创建两个接口用于用户登录根据ID查找用户如下
controller层
import com.hezy.pojo.entity.User;
import com.hezy.pojo.vo.Result;
import com.hezy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;RestController
RequestMapping(/exception)
public class UserController {Autowiredprivate UserService userService;PostMapping(/login)public Result login(RequestBody User user){return userService.login(user);}GetMapping(/get)public Result get(Integer id){return userService.getUser(id);}
}Service实现类其中TODO表示待完成的部分
import cn.hutool.core.util.ObjUtil;
import com.hezy.pojo.entity.User;
import com.hezy.pojo.vo.Result;
import com.hezy.service.UserService;
import org.springframework.stereotype.Service;Service
public class UserServiceImpl implements UserService {Overridepublic Result login(User user) {// 对user进行校验if (!ObjUtil.isAllNotEmpty(user, user.getUsername(), user.getPassword())) {return Result.error(非法参数异常);}// TODO 根据用户名查询数据库校验该用户是否存在if (true) {return Result.error(该用户不存在);}// TODO 保存用户信息到数据库return Result.success(user);}Overridepublic Result getUser(Integer id) {// 对id进行校验if (id null || id 0) {return Result.error(非法参数异常);}// TODO 根据用户名查询数据库, 校验用户是否存在if (true) {return Result.error(该用户不存在);}return Result.success(new User(id, 张三, 123456));}
}用户实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;Data
AllArgsConstructor
NoArgsConstructor
public class User implements Serializable {private static final long serialVersionUID 1L;/*** id*/private Integer id;/*** 账号*/private String username;/*** 密码*/private String password;
}启动项目运行 测试登录接口因为在if里面写死了所以返回错误信息 测试获取用户对象接口因为在if里面写死了所以返回错误信息 异常枚举
接下来对上面的异常进行统一处理。
首先创建一个异常的枚举类里面包含了异常状态码异常信息等如下
/*** 异常枚举类*/
public enum ExceptionEnum {PARAM_EXCEPTION(10001, 非法参数异常),PARAM_LACK(10002, 参数不全异常),UNKNOW_EXCEPTION(99999, 未知异常);private int status;private String message;ExceptionEnum(int status, String message) {this.status status;this.message message;}public int getStatus() {return status;}public String getMessage() {return message;}
}自定义异常
创建一个自定义异常类继承RuntimeException类如下
import com.hezy.enums.ExceptionEnum;/*** 自定义异常*/
public class MyException extends RuntimeException{/*** 异常枚举*/private ExceptionEnum exceptionEnum;public MyException(ExceptionEnum exceptionEnum) {super(exceptionEnum.getMessage());this.exceptionEnum exceptionEnum;}public ExceptionEnum getExceptionEnum() {return exceptionEnum;}/*** 手动抛出异常* param exceptionEnum* return*/public static MyException throwException(ExceptionEnum exceptionEnum){return new MyException(exceptionEnum);}
}再创建一个异常的controller自定义捕获对应的异常并打印信息
import com.hezy.enums.ExceptionEnum;
import com.hezy.pojo.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局异常处理器*/
RestControllerAdvice
Slf4j
public class GlobalException {/*** 自定义异常* param e* return*/ExceptionHandler(MyException.class)public Result handleException(MyException e){log.error(e.getMessage());return Result.builder().code(0).msg(e.getExceptionEnum().getMessage()).build();}/*** 全局异常* param e* return*/ExceptionHandler(Exception.class)public Result handleException(Exception e){log.error(e.getMessage());return Result.builder().code(0).msg(ExceptionEnum.UNKNOW_EXCEPTION.getMessage()).build();}
}最后对前面业务实现类里面的代码进行修改当参数校验错误时直接抛出异常如下
import cn.hutool.core.util.ObjUtil;
import com.hezy.enums.ExceptionEnum;
import com.hezy.exception.MyException;
import com.hezy.pojo.entity.User;
import com.hezy.pojo.vo.Result;
import com.hezy.service.UserService;
import org.springframework.stereotype.Service;Service
public class UserServiceImpl implements UserService {Overridepublic Result login(User user) {// 对user进行校验其中user、username、password都不能为空if (!ObjUtil.isAllNotEmpty(user, user.getUsername(), user.getPassword())) {throw new MyException(ExceptionEnum.PARAM_LACK);}// TODO 根据用户名查询数据库校验该用户是否存在if (true) {return Result.error(该用户不存在);}// TODO 保存用户信息到数据库return Result.success(user);}Overridepublic Result getUser(Integer id) {// id null参数不全异常if (id null) {throw new MyException(ExceptionEnum.PARAM_LACK);}// id 0非法参数异常if (id 0) {throw new MyException(ExceptionEnum.PARAM_EXCEPTION);}// TODO 根据用户名查询数据库, 校验用户是否存在if (true) {return Result.error(该用户不存在);}return Result.success(new User(id, 张三, 123456));}
}启动项目测试
当user中的username为空时 当获取对象的id 0时 当发生其他未知异常时如post请求的接口我们使用get方式发送时 就会被全局异常捕获到并在控制台打印报错信息 如果此时需要新增一个异常只需要在ExceptionEnum异常枚举类中新增一个枚举项即可如下
新增一个登录异常
/*** 异常枚举类*/
public enum ExceptionEnum {PARAM_EXCEPTION(10001, 非法参数异常),PARAM_LACK(10002, 参数不全异常),LOGIN_EXCEPTION(10003, 登录异常),UNKNOW_EXCEPTION(99999, 未知异常);private int status;private String message;ExceptionEnum(int status, String message) {this.status status;this.message message;}public int getStatus() {return status;}public String getMessage() {return message;}
}总结
通过异常枚举类 自定义异常类 SpringBoot的异常处理注解可以实现对项目量身定做一套异常处理机制根据项目中出现的异常来返回对应的异常信息非常方便。