项目全局异常处理

使用全局异常处理的好处就是我们写项目不需要疯狂的try{}cache,而是在一个地方全局的去处理,话不多说直接上代码

1、先定义一个自定义异常类,方便自己控制嘛

package com.qbb.reggie.common.exception;

import lombok.Data;

/**
 * @author QIUQIU&LL (个人博客:https://www.cnblogs.com/qbbit)
 * @version 1.0
 * @date 2022-08-28  19:37
 * @Description:
 */
@Data
public class ReggieException extends RuntimeException {

    private Integer code;

    public ReggieException(String message, Integer code) {
        super(message);
        this.code = code;
    }

    @Override
    public String toString() {
        return "ReggieException{" +
                "code=" + code +
                ",message=" + this.getMessage() +
                '}';
    }
}

2、在定义一个通用的ResultCodeEnum (枚举项大家自定义啦)

package com.qbb.reggie.common;

import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
@SuppressWarnings({"all"})
public enum ResultCodeEnum {

    SUCCESS(true, 20000, "成功"),
    UNKNOWN_REASON(false, 20001, "未知错误"),

    BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),
    JSON_PARSE_ERROR(false, 21002, "json解析异常"),
    PARAM_ERROR(false, 21003, "参数不正确"),

    FILE_UPLOAD_ERROR(false, 21004, "文件上传错误"),
    FILE_DELETE_ERROR(false, 21005, "文件刪除错误"),
    EXCEL_DATA_IMPORT_ERROR(false, 21006, "Excel数据导入错误"),

    PAY_RUN(false, 25000, "支付中"),
    PAY_UNIFIEDORDER_ERROR(false, 25001, "统一下单错误"),
    PAY_ORDERQUERY_ERROR(false, 25002, "查询支付结果错误"),

    CODE_ERROR(false, 28000, "验证码错误"),

    LOGIN_PHONE_ERROR(false, 28009, "手机号码不正确"),
    LOGIN_MOBILE_ERROR(false, 28001, "账号不正确"),
    LOGIN_PASSWORD_ERROR(false, 28008, "密码不正确"),
    LOGIN_DISABLED_ERROR(false, 28002, "该用户已被禁用"),
    REGISTER_USERNAME_ERROR(false, 28003, "账号已被注册"),
    LOGIN_AUTH(false, 28004, "需要登录"),
    LOGIN_ACL(false, 28005, "没有权限"),
    SMS_SEND_ERROR(false, 28006, "短信发送失败"),
    SMS_SEND_ERROR_BUSINESS_LIMIT_CONTROL(false, 28007, "短信发送过于频繁");


    private Boolean success;

    private Integer code;

    private String message;

    ResultCodeEnum(Boolean success, Integer code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;
    }
}

3、全局异常处理的Handler处理器

package com.qbb.reggie.handler;

import com.qbb.reggie.common.R;
import com.qbb.reggie.common.exception.ReggieException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理所有为自定义的异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public R error(Exception e) {
        log.error(ExceptionUtils.getMessage(e));
        return R.error("出错啦!!!");
    }

    /**
     * 处理自定义异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(ReggieException.class)
    public R error(ReggieException e) {
        log.error(ExceptionUtils.getMessage(e));
        return R.error(e.getMessage());
    }

}

4、在业务处理的地方直接抛出自定义异常就好了

if (dbEmployee != null) {
            throw new ReggieException(ResultCodeEnum.REGISTER_USERNAME_ERROR.getMessage(), ResultCodeEnum.REGISTER_USERNAME_ERROR.getCode());
        }

image

posted @   我也有梦想呀  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示