SpringBoot 添加全局异常统一处理代码

首先提供一个自定义异常,使用已定义好的错误码枚举ResultCode,用来在代码中对可预知的异常进行抛出处理。

java 复制代码
package com.example.demo.exception;

import com.example.demo.result.ResultCode;
import lombok.Getter;

/**
 * 自定义异常
 * @auther wangbo
 * @date 2021-01-13 17:27
 */
@Getter
public class CustomException extends RuntimeException{

    private final ResultCode resultCode;

    public CustomException(ResultCode resultCode){
        super(resultCode.getMessage());
        this.resultCode = resultCode;
    }

}

接下来需要提供一个全局异常统一处理类,主要用到两个注解:@RestControllerAdvice@ExceptionHandler

java 复制代码
package com.example.demo.common.exception;

import com.example.demo.common.result.Result;
import com.example.demo.common.result.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ValidationException;

/**
 * 全局异常统一处理
 *
 * @author wangbo
 * @date 2021/05/12
 */
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerAdvice {

    /**
     * 通用异常处理
     */
    @ExceptionHandler(Exception.class)
    public Result<Void> exceptionHandler(Exception e) {
        log.error("通用异常处理", e);
        return Result.failure(ResultCode.PROGRAM_INSIDE_EXCEPTION);
    }

    /**
     * 自定义异常处理
     */
    @ExceptionHandler(CustomException.class)
    public Result<Void> customExceptionHandler(CustomException e) {
        log.info("自定义异常处理");
        return Result.failure(e.getResultCode());
    }

    /**
     * 参数校验结果异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Void> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        log.info("参数校验结果异常处理");
        BindingResult bindingResult = e.getBindingResult();
        FieldError fieldError = bindingResult.getFieldError();
        assert fieldError != null;
        return Result.failure(fieldError.getField() + " : " + fieldError.getDefaultMessage());
    }

    /**
     * 参数校验过程异常处理
     */
    @ExceptionHandler(ValidationException.class)
    public Result<Void> validationExceptionHandler(ValidationException e) {
        log.error("参数校验过程异常处理", e);
        return Result.failure(ResultCode.PROGRAM_INSIDE_EXCEPTION);
    }

}

最后两个有关参数校验的异常处理在本文中并没有使用,是在接口参数校验中用到的。

使用示例,直接进行抛出,抛出的异常会在全局异常处理类中统一进行处理:

java 复制代码
@GetMapping("/list")
public List<User> list(){
    if (true){
    	//直接抛出异常,该自定义异常会被ExceptionHandlerAdvice类中的customExceptionHandler方法处理。
        throw new CustomException(ResultCode.REQUEST_PARAM_ERROR);
    }
    return userService.list();
}

这个接口会直接返回如下结果:

json 复制代码
{
    "code":50002,
    "message":"请求参数错误",
    "data":null
}
相关推荐
Jasonakeke28 分钟前
SpringBoot自动配置原理揭秘
java·spring boot·后端
C137的本贾尼1 小时前
Spring AI Alibaba 模型全家桶:接入通义、百川、LLaMA 等第三方 LLM
人工智能·spring·llama
C+-C资深大佬1 小时前
SSM 框架(Spring + SpringMVC + MyBatis)
java·spring·mybatis
IT_陈寒2 小时前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
Ramble_Naylor2 小时前
东方通(TongWeb)SpringBoot开发指导
java·spring boot
uzong2 小时前
面试官:如何做好架构设计
后端·架构
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【64】 ReactAgent 长期记忆
java·人工智能·spring
Cosolar2 小时前
QwenPaw Agent 实现原理深度剖析
后端·面试·架构
JacksonMx2 小时前
@Transactional 最佳实践
java·spring boot·spring·性能优化
Sincerelyplz2 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent