springboot下添加全局异常处理和自定义异常处理的过程解析

 更新时间:2023年12月12日 09:00:50   作者:Scotyzh  
在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便,这篇文章主要介绍了springboot下添加全局异常处理和自定义异常处理,需要的朋友可以参考下

前言

在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。

相关代码:

GlobalExceptionHandler类:

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /********************************
     *  @function  : 自定义从捕捉
     *  @parameter : [e:CustomException | 自定义异常]
     *  @date      : 2023/12/5 11:47
     ********************************/
    @ExceptionHandler(value = CustomException.class)
    public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) {
        log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
        return new AjaxResult(e.getCode() , e.getMessage(), null);
    }
    /********************************
     *  @function  : 空指针异常捕捉
     *  @parameter : [e:Exception | 异常]
     *  @date      : 2023/12/5 11:47
     ********************************/
    @ExceptionHandler(value = Exception.class)
    public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) {
        log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
        return new AjaxResult(500 , e.getMessage(), null);
    }
}

自定义异常CustomException类:

@Slf4j
@Data
public class CustomException extends RuntimeException{
    //错误码
    private int code;
    //错误信息
    private String message;
    public CustomException() {
        super();
    }
    public CustomException(ResultCodeEnum resultCodeEnum) {
        super(String.valueOf(resultCodeEnum.getCode()));
        this.code = resultCodeEnum.getCode();
        this.message = resultCodeEnum.getMessage();
    }
}

通用返回类:AjaxResult

@Data
public class AjaxResult extends HashMap<String, Object> {
    // 状态码
    private static final String CODE_TAG = "code";
    // 返回消息
    private static final String MSG_TAG = "message";
    // 数据对象
    private static final String DATA_TAG = "data";
    public AjaxResult(int code, String message, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, message);
        if (data != null)
        {
            super.put(DATA_TAG, data);
        }
    }
    /********************************
     *  @method    : success
     *  @function  : 返回成功消息(重载)
     *  @parameter :
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult success(){
        return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
    }
    /********************************
     *  @method    : success
     *  @function  : 返回成功消息(重载)
     *  @parameter : message : String | 返回消息
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult success(String message){
        return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null);
    }
    /********************************
     *  @method    : success
     *  @function  : 返回成功消息(重载)
     *  @parameter : data : Object | 数据对象
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult success(Object data){
        return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
    }
    /********************************
     *  @method    : success
     *  @function  : 返回成功消息(重载)
     *  @parameter : message : String | 返回消息
     *  @parameter : data : Object | 数据对象
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult success(String message, Object data){
        return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data);
    }
    /********************************
     *  @method    : failed
     *  @function  : 返回失败消息(重载)
     *  @parameter :
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult failed(){
        return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
    }
    /********************************
     *  @method    : failed
     *  @function  : 返回失败消息(重载)
     *  @parameter : message : String | 返回消息
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult failed(String message){
        return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null);
    }
    /********************************
     *  @method    : failed
     *  @function  : 返回失败消息(重载)
     *  @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult failed(ResultCodeEnum resultCodeEnum){
        return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
    }
    /********************************
     *  @method    : failed
     *  @function  : 返回失败消息(重载)
     *  @parameter : message : String | 返回消息
     *  @parameter : data : Object | 数据对象
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult failed(String message, Object data){
        return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data);
    }
    /********************************
     *  @method    : failed
     *  @function  : 返回失败消息(重载)
     *  @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
     *  @parameter : data : Object | 数据对象
     *  @return    : AjaxResult
     ********************************/
    public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){
        return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
    }
}

枚举类ResultCodeEnum:

public enum ResultCodeEnum {
    // 10??? 通用
    SUCCESS(10000,"请求成功"),
    FAILED(10008, "请求失败"),
    FAILED_PARAM_ERROR(10009, "参数错误"),
...
    private Integer code;
    private String message;
    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public int getCode(){
        return code;
    }
    public String getMessage(){
        return message;
    }
}

使用:

在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。

    public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) {
        if (userId == 0) {
            throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR);
        }
        ...
    }

再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端

    @GetMapping("/test")
    public AjaxResult test(){
        int i = 60/0;
        return AjaxResult.success();
    }

到此这篇关于springboot下添加全局异常处理和自定义异常处理的文章就介绍到这了,更多相关springboot异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud根据服务名获取服务的ip端口问题

    Spring Cloud根据服务名获取服务的ip端口问题

    这篇文章主要介绍了Spring Cloud根据服务名获取服务的ip端口,本篇示例我就以Nacos注册中心为例了,下面是我注册的两个服务,需要的朋友可以参考下
    2022-09-09
  • 关于Springboot日期时间格式化处理方式总结

    关于Springboot日期时间格式化处理方式总结

    这篇文章主要介绍了关于Springboot日期时间格式化处理方式总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java Stream所有方法实例详解

    Java Stream所有方法实例详解

    该文章详细介绍了Java Stream API的创建、中间操作和终止操作,包括各种流的创建方法、常用中间操作(如filter、map、sorted等)和终止操作(如collect、forEach、reduce等),本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-12-12
  • IntelliJ Idea常用11款插件(提高开发效率)

    IntelliJ Idea常用11款插件(提高开发效率)

    这篇文章主要介绍了IntelliJ Idea常用11款插件(提高开发效率),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java开发中读取XML与properties配置文件的方法

    Java开发中读取XML与properties配置文件的方法

    这篇文章主要介绍了Java开发中读取XML与properties配置文件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • MyEclipse整合ssh三大框架环境搭载用户注册源码下载

    MyEclipse整合ssh三大框架环境搭载用户注册源码下载

    这篇文章主要为大家详细介绍了如何使用MyEclipse整合ssh三大框架进行环境搭载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 关于Java中的klass和class

    关于Java中的klass和class

    这篇文章主要介绍了关于Java中klass和class的区别,vm加载的字节码,也就是.class文件,被加载到方法区里面,叫Kclass,是一个C++对象,含有类的信息、虚方法表等,需要的朋友可以参考下
    2023-08-08
  • Idea导入eureka源码实现过程解析

    Idea导入eureka源码实现过程解析

    这篇文章主要介绍了Idea导入eureka源码实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • springboot 多数据源配置不生效遇到的坑及解决

    springboot 多数据源配置不生效遇到的坑及解决

    这篇文章主要介绍了springboot 多数据源配置不生效遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot整合SSE实时通信的问题小结

    Spring Boot整合SSE实时通信的问题小结

    本文介绍了服务器发送事件(Server-Sent Events,SSE)技术,其主要特点包括单向数据流、自动重连、自定义事件类型等,SSE适用于实时更新场景,如新闻推送、评论系统等,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论