微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常

简介: 本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。

3. 拦截自定义异常

在实际项目中,除了拦截一些系统异常外,在某些业务上,我们需要自定义一些业务异常,比如在微服务中,服务之间的相互调用很平凡,很常见。要处理一个服务的调用时,那么可能会调用失败或者调用超时等等,此时我们需要自定义一个异常,当调用失败时抛出该异常,给 GlobalExceptionHandler 去捕获。

3.1 定义异常信息

由于在业务中,有很多异常,针对不同的业务,可能给出的提示信息不同,所以为了方便项目异常信息管理,我们一般会定义一个异常信息枚举类。比如:

/**

* 业务异常提示信息枚举类

* @author shengwu ni

*/

public enum BusinessMsgEnum {

  /** 参数异常 */

  PARMETER_EXCEPTION("102", "参数异常!"),

  /** 等待超时 */

  SERVICE_TIME_OUT("103", "服务调用超时!"),

  /** 参数过大 */

  PARMETER_BIG_EXCEPTION("102", "输入的图片数量不能超过50张!"),

  /** 500 : 一劳永逸的提示也可以在这定义 */

  UNEXPECTED_EXCEPTION("500", "系统发生异常,请联系管理员!");

  // 还可以定义更多的业务异常

  /**

   * 消息码

   */

  private String code;

  /**

   * 消息内容

   */

  private String msg;

  private BusinessMsgEnum(String code, String msg) {

      this.code = code;

      this.msg = msg;

   }

   // set get方法

}

3.2 拦截自定义异常

然后我们可以定义一个业务异常,当出现业务异常时,我们就抛这个自定义的业务异常即可。比如我们定义一个 BusinessErrorException 异常,如下:

/**

* 自定义业务异常

* @author shengwu ni

*/

public class BusinessErrorException extends RuntimeException {

   

   private static final long serialVersionUID = -7480022450501760611L;


   /**

    * 异常码

    */

   private String code;

   /**

    * 异常提示信息

    */

   private String message;


   public BusinessErrorException(BusinessMsgEnum businessMsgEnum) {

       this.code = businessMsgEnum.code();

       this.message = businessMsgEnum.msg();

   }

// get set方法

}

在构造方法中,传入我们上面自定义的异常枚举类,所以在项目中,如果有新的异常信息需要添加,我们直接在枚举类中添加即可,很方便,做到统一维护,然后再拦截该异常时获取即可。

@ControllerAdvice

@ResponseBody

public class GlobalExceptionHandler {


   private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

   /**

    * 拦截业务异常,返回业务异常信息

    * @param ex

    * @return

    */

   @ExceptionHandler(BusinessErrorException.class)

   @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)

   public JsonResult handleBusinessError(BusinessErrorException ex) {

       String code = ex.getCode();

       String message = ex.getMessage();

       return new JsonResult(code, message);

   }

}

在业务代码中,我们可以直接模拟一下抛出业务异常,测试一下:

@RestController

@RequestMapping("/exception")

public class ExceptionController {


   private static final Logger logger = LoggerFactory.getLogger(ExceptionController.class);


   @GetMapping("/business")

   public JsonResult testException() {

       try {

           int i = 1 / 0;

       } catch (Exception e) {

           throw new BusinessErrorException(BusinessMsgEnum.UNEXPECTED_EXCEPTION);

       }

       return new JsonResult();

   }

}

运行一下项目,测试一下,返回 json 如下,说明我们自定义的业务异常捕获成功:

{"code":"500","msg":"系统发生异常,请联系管理员!"}

4. 总结

本节课程主要讲解了Spring Boot 的全局异常处理,包括异常信息的封装、异常信息的捕获和处理,以及在实际项目中,我们用到的自定义异常枚举类和业务异常的捕获与处理,在项目中运用的非常广泛,基本上每个项目中都需要做全局异常处理。

课程源代码下载地址:戳我下载

目录
相关文章
|
9月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
9月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
771 2
|
10月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
1005 117
|
10月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7275 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
960 0
|
11月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1478 3
|
12月前
|
JSON Java 数据库
第08课:Spring Boot中的全局异常处理
第08课:Spring Boot中的全局异常处理
1070 0