• Springboot全局异常和自定义异常


    目录

    依赖

    一、全局异常处理 

    1、系统异常

     2、业务异常

    (1)、接口配置

    (2)、服务配置

    二、自定义异常 

    依赖

    1. <dependency>
    2. <groupId>org.hibernate.validatorgroupId>
    3. <artifactId>hibernate-validatorartifactId>
    4. dependency>

    一、全局异常处理 

    1、系统异常

    在common目录中新建一个BaseException.class,用于接受全局的异常,一定要附上@RestControllerAdvice,才能被识别。

    1. /**
    2. * 全局异常处理器
    3. */
    4. @RestControllerAdvice
    5. public class BaseException {
    6. }

    对于参数格式有问题、代码运行错误等不可控因素的系统报错,默认的效果是这样:

    而以下是系统异常的封装处理,返回我们规范的报错信息,

    @ExceptionHandler是针对不同的报错类

    @RequestLogAnnotation是我的aop日志处理,用于保存mysql

    1. /**
    2. * 全局异常处理器
    3. */
    4. @RestControllerAdvice
    5. public class BaseException {
    6. /**
    7. * 系统异常
    8. * @param e 异常信息
    9. * @return Result
    10. */
    11. @ExceptionHandler(value = {Exception.class})
    12. @RequestLogAnnotation
    13. @ResponseBody
    14. public Result exceptionHandler(Exception e){
    15. return Result.error(500,"系统异常错误,请联系系统管理员处理!");
    16. }
    17. }

    他的结果就是这样的:

     2、业务异常

    (1)、接口配置

    我这里以post接口@RequestBody为例,接口如下,给dto对象前加上@Validated,

    1. /**
    2. * 登录
    3. * @param dto 暂存输入参数dto对象
    4. * @return
    5. */
    6. @RequestLogAnnotation(value = "用户登录")
    7. @PostMapping("/login")
    8. public Result login(@RequestBody @Validated LoginDto dto) {
    9. // 进行对比
    10. Login res = loginService.userLogin(dto);
    11. // 判断结果是否返回该账号信息
    12. if (res != null) {
    13. return Result.success(200, "登录成功", data);
    14. } else {
    15. return Result.error(501, "登陆失败");
    16. }
    17. }

     然后,在实体类中给对应参数,加上@NotNull,其中的【(message = "用户账号不能为空")】这一段是在参数未空时报错返回的信息,用于返回给前端,但需要后台处理。

    1. /**
    2. * 接受登录请求的参数
    3. */
    4. @Data
    5. public class LoginDto {
    6. @NotNull(message = "用户账号不能为空")
    7. private String id;
    8. @NotNull(message = "用户密码不能为空")
    9. private String password;
    10. }
    (2)、服务配置

    最后在前面的全局异常类中添加如下代码:

    1. /**
    2. * 请求参数缺失异常处理
    3. * @param ex
    4. * @return
    5. */
    6. @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    7. @ResponseStatus(HttpStatus.OK)
    8. @RequestLogAnnotation
    9. @ResponseBody
    10. public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
    11. Result result = new Result();
    12. BindingResult bindingResult = ex.getBindingResult();
    13. StringBuilder sb = new StringBuilder("校验失败:");
    14. for (FieldError fieldError : bindingResult.getFieldErrors()) {
    15. sb.append(fieldError.getDefaultMessage()).append(", ");
    16. }
    17. String msg = sb.toString();
    18. result.setCode(500);
    19. result.setMsg(msg);
    20. return result;
    21. }

    这时候请求里因为参数缺失,就会通过这个方法报错:

    二、自定义异常 

     新建一个自定义异常类ServiceException.class,继承RuntimeException,如下(这里为了简化,只留一个getter方法和1个构造函数):

    1. public class ServiceException extends RuntimeException{
    2. private Integer code;
    3. public Integer getCode() {
    4. return code;
    5. }
    6. public ServiceException (Integer code, String msg) {
    7. super(msg);
    8. this.code = code;
    9. }
    10. }

    然后在全局异常类中添加如下代码(和系统异常基本一致,只需要更换@ExceptionHandler中的对应类即可):

    1. /**
    2. * 如果抛出的的是ServiceException,则调用该方法
    3. * @param e 服务异常
    4. * @return Result
    5. */
    6. @ExceptionHandler(ServiceException.class)
    7. @RequestLogAnnotation
    8. @ResponseBody
    9. public Result serviceExceptionHandle(ServiceException e){
    10. return Result.success(e.getCode(), e.getMessage());
    11. }

    这时候就可以在接口中使用try和catch方法进行判断异常使用了,如下:

    1. // sql执行判断
    2. try{
    3. res = getOne(queryWrapper);
    4. } catch (Exception e) {
    5. throw new ServiceException(500, e);
    6. }

  • 相关阅读:
    RFID安全的三次认证
    基于Flask开发的前后端交互项目(可用于期末大作业)& MySQL数据库 & 文件上传 & Spider爬虫 & Echarts可视化展示 & JS动态
    VPG算法
    udp接收队列以及多次初始化的测试
    Python---练习:for循环 求1-100的和/所有偶数的和
    nginx几个常见的配置项
    PHP中CURL请求添加UA
    GPT的广泛应用会对互联网公司造成挑战吗?——探讨GPT在实际使用中的应用和影响
    昇腾搭建PyTorch环境(训练)
    云计算导论(3)---分布式文件系统
  • 原文地址:https://blog.csdn.net/weixin_42966151/article/details/133753243