首页 > 其他分享 >封装全局异常处理

封装全局异常处理

时间:2023-09-24 11:32:14浏览次数:24  
标签:code 封装 description errorCode return 全局 异常 public String

1 定义错误码类

​ 可以定义各种错误码枚举,比如业务,系统相关的报错信息

/**
 * 错误代码
 * 错误码
 *
 * @author leovany
 * @date 2023/09/23
 */
public enum ErrorCode {
    SUCCESS(0, "success", ""),
    ERROR_PARAMS(40000, "请求参数错误", ""),
    ERROR_NULL(40001, "请求数据为空", ""),
    ERROR_LOGIN(40100, "未登录", ""),
    ERROR_NO_AUTH(41001, "无权限", ""),
    ERROR_SYSTEM(50000, "系统内部异常", "")
    ;


    /**
     * 错误码ID
     */
    private final int code;

    /**
     * 错误码信息
     */
    private final String message;

    /**
     * 错误码描述(详情)
     */
    private final String description;

    ErrorCode(int code, String message, String description) {
        this.code = code;
        this.message = message;
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public String getDescription() {
        return description;
    }
}

2 定义业务异常类

  • 相对于 java 的异常类,支持更多字段

    扩展了 codedescription两个字段

  • 自定义构造函数,更灵活 / 快捷的设置字段

import com.leovany.usercenter.common.ErrorCode;

/**
 * 业务异常
 * 自定义业务异常类
 *
 * @author leovany
 * @date 2023/09/23
 */
public class BusinessException extends RuntimeException {

    /**
     * 错误码
     */
    private final int code;

    /**
     * 描述
     */
    private final String description;

    /**
     * 业务异常
     *
     * @param message     信息
     * @param code        错误码
     * @param description 描述
     */
    public BusinessException(String message, int code, String description) {
        super(message);
        this.code = code;
        this.description = description;
    }

    /**
     * 业务异常
     *
     * @param errorCode 错误代码
     */
    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.code = errorCode.getCode();
        this.description = errorCode.getDescription();
    }

    /**
     * 业务异常
     *
     * @param errorCode   错误代码
     * @param description 描述
     */
    public BusinessException(ErrorCode errorCode, String description) {
        super(errorCode.getMessage());
        this.code = errorCode.getCode();
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }
}

3 全局异常处理器

  • 通过Spring AOP实现,在调用方法前后进行额外的处理

  • 作用

    • 捕获代码中所有的异常,让前端得到更详细的业务报错信息
    • 屏蔽掉项目框架本身的异常,不暴露服务器的内部状态
    • 集中处理,比如还可以做记录日志
import com.leovany.usercenter.common.ResultVO;
import com.leovany.usercenter.common.ErrorCode;
import com.leovany.usercenter.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理类
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理异常-BusinessException
     * @param e
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public ResultVO<?> businessExceptionHandler(BusinessException e){
        log.error("businessException:" + e.getMessage(),e);
        return ResultUtils.error(e.getCode(),e.getMessage(),e.getDescription());
    }

    /**
     * 处理异常-RuntimeException
     * @param e
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    public ResultVO<?> runtimeExceptionHandler(RuntimeException e){
        log.error("runtimeException:" + e);
        return ResultUtils.error(ErrorCode.ERROR_SYSTEM,e.getMessage());
    }
}

4 使用

throw new BusinessException可以在方法中,任意地方抛出,很方便

  • 示例代码
@PostMapping("/login")
public ResultVO<User> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {

    String userAccount = userLoginRequest.getUserAccount();
    String userPassword = userLoginRequest.getUserPassword();

    if (StringUtils.isAnyBlank(userAccount, userPassword)) {
        throw new BusinessException(ErrorCode.ERROR_PARAMS);
    }
    User user = userService.doLogin(userAccount, userPassword, request);
    return ResultUtils.success(user);
}
  • 代码对比

image-20230923231424717

5 前端请求效果

image-20230923232720326

总结

​ 通过封装全局异常处理,对异常信息做了统一处理,让前端得到更详细的业务信息,同时保证系统的安全性(不会暴露系统内部信息),在代码上对参数校验等方面提供更加方便的形式。

标签:code,封装,description,errorCode,return,全局,异常,public,String
From: https://blog.51cto.com/u_4315475/7585061

相关文章

  • 封装全局异常处理
    目录1定义错误码类2定义业务异常类3全局异常处理器4使用5前端请求效果总结1定义错误码类​ 可以定义各种错误码枚举,比如业务,系统相关的报错信息/***错误代码*错误码**@authorleovany*@date2023/09/23*/publicenumErrorCode{SUCCESS(0,"succe......
  • 在python开发过程中常见的异常错误
    下面这些也是常见的异常错误,在报错的时候不要害怕,记住这些常见的单词。AttributeError尝试访问未知的对象属性EOFError用户输入文件末尾标志EOF(Ctrl+d)FloatingPointError浮点计算错误GeneratorExitgenerator.close()方法被调用的时候ImportError导入模块失败......
  • Name or service not known异常处理方法总结
    本人用VmWorkStationPro搭建立centos7环境,在配置静态ip后,虚机与物理主机网络连通,但是虚机却无法访问外网,贴个图吧 也就是Nameorservicenotknown这个错误。本人虚拟机网络为桥接,物理主机连接的是家里的wifi。以下是本人解决无法访问外网的步骤:1.cd/etc/sysconfig/networ......
  • 封装总结
    封装就是把public的类变成private的类(个人理解)露出该露的,封装该封装的定义一个私有类以后可以用ALT+INSERT快捷生成get和set方法get方法主要是为了拿到私有类set是为了设置私有类的值,以及在set方法中写一些判断条件,以防止出现一些不合理的值构造器,就是一个无参的一旦有了有......
  • 假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时
    假设a是一个由线程1和线程2共享的初始值为0的全局变量,则线程1和线程2同时执行下面的代码,最终a的结果不可能是()booleanisOdd=false;for(inti=1;i<=2;++i){if(i%2==1)isOdd=true;elseisOdd=false;a+=i*(isOdd?1:-1);}A:-1B:-2C:0D:1......
  • 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法
    globalData和storage的区别一、app.globalData是全局变量,下次进入的时候,就要重新获取,一般用于:1、保存一些可能涉及安全类的数据,例如资源类,每次需要很准确的,就建议用全局变量。2、全局变量每次关闭小程序重新打开的时候,都会进行初始化更新。二、缓存(StorageSync)本地存储,storage......
  • appium+Python封装日志类
    创建logger.py文件放置在框架目录Common文件夹下,logger.py代码如下:#_*_coding:utf-8_*_importloggingimporttimeclassLogger(object):def__init__(self,logger):self.logger=logging.getLogger(logger)self.logger.setLevel(logging.DE......
  • 关于vue的axios请求的封装
    先加载axiosimportaxiosfrom'axios';importVuefrom'vue';importQsfrom'qs';importurlsfrom'./url'import{ Message}from'element-ui';//用来设置接口请求频繁时候的调用varapi_url;varapi_data;//axios.def......
  • 5.使用日志+自定义全局异常过滤器
    刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception 其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。基础的仓储模式已经ok,Autofac已经注入......
  • umi-Request请求封装
    /** *request网络请求工具 *更详细的api文档:https://github.com/umijs/umi-request */import{extend}from'umi-request';import{notification,message}from'antd';import{getToken}from'./utils';constcodeMessage={ ......