java封装全局异常处理深入详解

 更新时间:2023年09月24日 11:31:40   作者:Leovany  
这篇文章主要为大家介绍了java封装全局异常处理的深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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);
}
  • 代码对比

5 前端请求效果

总结

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

以上就是java封装全局异常处理深入详解的详细内容,更多关于java封装全局异常处理的资料请关注脚本之家其它相关文章!

相关文章

  • Java应用服务器之tomcat会话复制集群配置的示例详解

    Java应用服务器之tomcat会话复制集群配置的示例详解

    这篇文章主要介绍了Java应用服务器之tomcat会话复制集群配置的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java使用Zxing二维码生成的简单示例

    Java使用Zxing二维码生成的简单示例

    ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库,下面这篇文章主要给大家介绍了关于Java使用Zxing二维码生成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
    2023-04-04
  • Java代码性能测试实战之ContiPerf安装使用

    Java代码性能测试实战之ContiPerf安装使用

    这篇文章主要为大家介绍了Java代码性能测试实战之ContiPerf安装使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Spring MVC数据绑定概述及原理详解

    Spring MVC数据绑定概述及原理详解

    这篇文章主要介绍了Spring MVC数据绑定概述及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java程序员必须知道的5个JVM命令行标志

    Java程序员必须知道的5个JVM命令行标志

    这篇文章主要介绍了每个Java程序员必须知道的5个JVM命令行标志,需要的朋友可以参考下
    2015-03-03
  • 浅谈web服务器项目中静态请求和动态请求处理

    浅谈web服务器项目中静态请求和动态请求处理

    这篇文章主要介绍了浅谈web服务器项目中静态请求和动态请求处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java中HashSet和LinkedHashSet详解

    Java中HashSet和LinkedHashSet详解

    这篇文章主要介绍了Java中HashSet和LinkedHashSet详解,   HashSet是Set接口的子类,其内部采用了HashMap作为数据存储,HashSet其实就是在操作HashMap的key,HashSet是无序存储的,不能保证元素的顺序;HashSet并没有进行同步处理,因此是线程不安全的,需要的朋友可以参考下
    2023-09-09
  • Java设计模式之里氏替换原则精解

    Java设计模式之里氏替换原则精解

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。本篇介绍设计模式七大原则之一的里氏替换原则
    2022-02-02
  • spring cloud gateway集成hystrix实战篇

    spring cloud gateway集成hystrix实战篇

    这篇文章主要介绍了spring cloud gateway集成hystrix实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论