全局异常处理

全局异常处理

1、减少try...catch

2、统一处理注解的message

1、响应结果枚举

java 复制代码
package com.zhw.enums;

@SuppressWarnings("all")
public enum AppHttpCodeEnum {
    // 成功
    SUCCESS(200,"操作成功"),
    // 登录
    PARAM_ERROR(400,"接口参数异常"),
    NEED_LOGIN(401,"需要登录后操作"),
    NO_OPERATOR_AUTH(403,"无权限操作"),
    SYSTEM_ERROR(500,"全局捕获的系统错误"),
    USERNAME_EXIST(501,"用户名已存在"),
    PASSWORD_ERROR(504,"密码错误"),
    USER_NAME_ERROR(505,"用户名错误");
    int code;
    String msg;
    AppHttpCodeEnum(int code, String errorMessage){
        this.code = code;
        this.msg = errorMessage;
    }
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

2、新建异常类

java 复制代码
package com.zhw.exception;
import com.zhw.enums.AppHttpCodeEnum;

@SuppressWarnings("all")
public class SystemException extends RuntimeException {
    private int code;
    private String msg;

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public SystemException(AppHttpCodeEnum httpCodeEnum) {
        super(httpCodeEnum.getMsg());
        this.code = httpCodeEnum.getCode();
        this.msg = httpCodeEnum.getMsg();
    }
}

3、新建全局异常处理handler

java 复制代码
package com.zhw.handler.exception;

import com.zhw.domain.ResponseResult;
import com.zhw.enums.AppHttpCodeEnum;
import com.zhw.exception.SystemException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice  // 1、全局异常处理,代替局部try catch 2、统一对message信息返回
@Slf4j
@SuppressWarnings("all")
public class GlobalExceptionHandler {

    // RequestBody 参数校验不通过处理处理
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseResult handleValidException(MethodArgumentNotValidException e) {
        // 打印异常信息
        log.error("接口参数! {}", e);
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        // 从异常对象中获取提示信息封装返回
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_ERROR.getCode(), objectError.getDefaultMessage());
    }
    @ExceptionHandler(SystemException.class)   // 指定需要处理的异常类型
    public ResponseResult systemExceptionHandler(SystemException e) {
        // 打印异常信息
        log.error("出现了异常! {}", e);
        // 从异常对象中获取提示信息封装返回
        return ResponseResult.errorResult(e.getCode(), e.getMsg());
    }

    @ExceptionHandler(Exception.class)
    public ResponseResult exceptionHandler(Exception e) {
        // 打印异常信息
        log.error("出现了异常! {}", e);
        // 从异常对象中获取提示信息封装返回
        return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage());
    }
}
相关推荐
亲爱的马哥4 分钟前
重磅更新 | 填鸭表单TDuckX2.9发布!
java
Java中文社群5 分钟前
26届双非上岸记!快手之战~
java·后端·面试
whitepure10 分钟前
万字详解Java中的面向对象(二)——设计模式
java·设计模式
whitepure12 分钟前
万字详解Java中的面向对象(一)——设计原则
java·后端
2301_7930868740 分钟前
SpringCloud 02 服务治理 Nacos
java·spring boot·spring cloud
回家路上绕了弯1 小时前
MySQL 详细使用指南:从入门到精通
java·mysql
小七rrrrr1 小时前
动态规划法 - 53. 最大子数组和
java·算法·动态规划
自由的疯1 小时前
在 Java IDEA 中使用 DeepSeek 详解
java·后端·架构
自由的疯1 小时前
Java 通过接口方式使用 DeepSeek 详解
java·后端·trae