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
}
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
大勇前进1 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
yuzhi_liu1 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile1 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白801 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙1 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端