项目中后端如何处理异常?

为了统一管理异常,在项目中封装了自定义异常类(BusinessException),全局异常处理器(GlobalExceptionHandler), 以及一些状态码(ErrorCode), 便于前端统一处理异常.

主要流程如下:

  1. 当项目业务发生逻辑错误时,会抛出BusinessException, 其中包含自定义错误码和信息.
  2. GlobalExceptionHandler 会捕获这个 BusinessException,并返回一个统一的响应给前端.
  3. 如果是未预料到的系统内部异常(RountimeException),GlobalExceptionHandler 也会捕捉, 并统一返回给前端错误码(50000) 和错误信息(系统内部异常).

这样便于便于前端快速定位错误原因, 便于在后续不同场景下精细化管理异常.

代码如下

BussinessException

java 复制代码
@Getter  
public class BusinessException extends RuntimeException {  
  
    /**  
     * 错误码  
     */  
    private final int code;  
  
    public BusinessException(int code, String message) {  
        super(message);  
        this.code = code;  
    }  
  
    public BusinessException(ErrorCode errorCode) {  
        super(errorCode.getMessage());  
        this.code = errorCode.getCode();  
    }  
  
    public BusinessException(ErrorCode errorCode, String message) {  
        super(message);  
        this.code = errorCode.getCode();  
    }  
  
}

ErrorCode

java 复制代码
@Getter  
public enum ErrorCode {  
  
    SUCCESS(0, "ok"),  
    PARAMS_ERROR(40000, "请求参数错误"),  
    NOT_LOGIN_ERROR(40100, "未登录"),  
    NO_AUTH_ERROR(40101, "无权限"),  
    NOT_FOUND_ERROR(40400, "请求数据不存在"),  
    FORBIDDEN_ERROR(40300, "禁止访问"),  
    SYSTEM_ERROR(50000, "系统内部异常"),  
    OPERATION_ERROR(50001, "操作失败");  
  
    /**  
     * 状态码  
     */  
    private final int code;  
  
    /**  
     * 信息  
     */  
    private final String message;  
  
    ErrorCode(int code, String message) {  
        this.code = code;  
        this.message = message;  
    }  
  
}

GlobalExceptionHeader

java 复制代码
/**  
 * 全局异常处理器  
 */  
@RestControllerAdvice  
@Slf4j  
public class GlobalExceptionHandler {  
  
    @ExceptionHandler(NotLoginException.class)  
    public BaseResponse<?> notLoginException(NotLoginException e) {  
        log.error("NotLoginException", e);  
        return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, e.getMessage());  
    }  
  
    @ExceptionHandler(NotPermissionException.class)  
    public BaseResponse<?> notPermissionExceptionHandler(NotPermissionException e) {  
        log.error("NotPermissionException", e);  
        return ResultUtils.error(ErrorCode.NO_AUTH_ERROR, e.getMessage());  
    }  
  
    @ExceptionHandler(BusinessException.class)  
    public BaseResponse<?> businessExceptionHandler(BusinessException e) {  
        log.error("BusinessException", e);  
        return ResultUtils.error(e.getCode(), e.getMessage());  
    }  
  
    @ExceptionHandler(RuntimeException.class)  
    public BaseResponse<?> businessExceptionHandler(RuntimeException e) {  
        log.error("RuntimeException", e);  
        return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");  
    }  
}
相关推荐
2401_841495642 小时前
【数据结构】基于Prim算法的最小生成树
java·数据结构·c++·python·算法·最小生成树·prim
木井巳3 小时前
[Java数据结构和算法] HashMap 和 HashSet
java·数据结构·1024程序员节
祈祷苍天赐我java之术4 小时前
解析常见的限流算法
java·数据结构·算法
摇滚侠4 小时前
IDEA 启动前端项目 IDEA 切换分支
java·ide·intellij-idea
元直数字电路验证4 小时前
Jakarta EE开发中,如何配置IntelliJ IDEA的远程调试?
java·eureka·intellij-idea
石头wang5 小时前
idea字体的问题(idea应用本身的字体问题)
java·ide·intellij-idea
孔明兴汉5 小时前
第一章-第三节-Java开发环境配置
java·开发语言
小王不爱笑1326 小时前
Java 核心知识点查漏补缺(一)
java·开发语言·python
空空kkk6 小时前
Java——类和对象
java·开发语言
JIngJaneIL6 小时前
篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·篮球论坛系统