dubbo自定义异常的完整步骤与测试

下面我会详细讲解“dubbo自定义异常的完整步骤与测试”的完整攻略:

规划异常类包结构

首先应该规划好异常类的包结构。通常情况下,我们会把异常类放在com.xxx.exception包中,这个包可以在provider、consumer、api中共用。在com.xxx.exception包中,我们可以建立一些子包,如com.xxx.exception.common表示一些通用的异常,如参数异常、权限异常等;com.xxx.exception.biz表示将业务相关的异常分门别类管理。如:

  • com.xxx.exception.biz.order: 订单相关的异常
  • com.xxx.exception.biz.user: 用户、操作员等相关的异常
  • com.xxx.exception.biz.product: 商品相关的异常
  • com.xxx.exception.biz.account: 账户相关的异常
  • com.xxx.exception.biz.stock: 库存相关的异常
  • com.xxx.exception.biz.finance: 财务相关的异常

当然,包的数量、命名根据实际情况而定。可以参考阿里巴巴的开发规范。

编写异常类

规划好包结构以后,我们就可以开始编写自定义的异常类了。首先我们要确定一下需要自定义的异常类型。

通常情况下,我们自定义的异常应该继承自运行时异常RuntimeException,因为它是编写业务逻辑时,最常用的异常类型。如果一个异常不需要在调用方法中被处理,那么就可以将它定义为运行时异常!

比如我们定义一个用户不存在异常类UserNotFoundException

package com.xxx.exception.biz.user;

public class UserNotFoundException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public UserNotFoundException() {
        super("user not found");
    }
}

如上所示,当我们在调用过程中如果发现需要抛出用户不存在异常时,就可以抛出UserNotFoundException了。如果需要指定异常信息,我们可以通过传参的方式进行。

如果我们的异常类型复杂些,需要包含更多信息,那么就可以自定义一个异常信息对象,如:

package com.xxx.exception.biz.order;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class OrderExceptionInfo {

    private String errorCode;

    private String errorMessage;

    public OrderExceptionInfo(String errorCode, String errorMessage) {
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }
}

然后我们就可以在异常类中引用这个异常信息对象了,如:

package com.xxx.exception.biz.order;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class OrderCreateException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private OrderExceptionInfo exceptionInfo;

    public OrderCreateException(OrderExceptionInfo exceptionInfo) {
        this.exceptionInfo = exceptionInfo;
    }
}

使用自定义异常

在dubbo服务接口中,通常情况下我们不会定义具体的异常信息,而是直接抛出自定义的异常类(已经定义好了的异常类型)

比如:

package com.xxx.api.order;

public interface OrderService {

    // 创建订单
    Long createOrder(OrderDTO orderDTO) throws OrderCreateException;

    // 取消订单
    void cancelOrder(Long orderId) throws OrderCancelException;

    // 查询订单
    OrderDTO getOrder(Long orderId) throws OrderNotFoundException;
}

其中,涉及到3个自定义的异常类型:

  • OrderCreateException: 订单创建异常,可能是参数错误、重复提交等原因
  • OrderCancelException: 订单取消异常,可能是非法操作等原因
  • OrderNotFoundException: 订单不存在异常,查询不到指定订单

接口实现类中,我们可以按照业务规则进行异常的抛出。

异常兜底

如果我们在抛出异常时,考虑到rpc调用过程中,网络传输等原因,抛出的异常类型可能不是我们预期的类型,这个时候就需要在服务消费方(Consumer)进行异常的处理。

比如:

@Reference(version = "1.0.0")
OrderService orderService;

public Long createOrder(OrderDTO orderDTO) {
    try {
        return orderService.createOrder(orderDTO);
    } catch (OrderCreateException e) {
        // 处理自定义异常
        log.error(e.getMessage());
        throw new BizException("订单创建失败", e.getCause());
    } catch (Exception e) {
        // 异常兜底
        log.error("订单创建失败, 参数: {}", orderDTO, e);
        throw new BizException("订单创建失败", e.getCause());
    }
}

如上所示,在捕获自定义异常以外的错误情况中,我们可以通过日志打印出来,记录下请求参数,方便后续排查问题。

测试自定义异常

最后,我们需要对自定义异常进行测试。

@Reference(version = "1.0.0")
OrderService orderService;

@Test(expected = OrderNotFoundException.class)
public void testGetOrder() {
    OrderDTO order = orderService.getOrder(1L);
}

如上所示,在测试中我们使用了@Test(expected)注解来捕获异常,如果我们抛出的异常类型和expected属性指定的异常类型一致,就算测试通过。

除了这种方法,还可以使用junit5中的assertThrows方法来进行测试,比较麻烦些。

@Test
public void testGetOrder() {
    Exception exception = assertThrows(OrderNotFoundException.class, () -> {
        OrderDTO order = orderService.getOrder(1L);
    });

    String expectedMessage = "order not found";
    String actualMessage = exception.getMessage();
    assertTrue(actualMessage.contains(expectedMessage));
}

整个自定义异常的开发到测试流程就介绍完了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:dubbo自定义异常的完整步骤与测试 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • SpringBoot实战教程之新手入门篇

    SpringBoot实战教程之新手入门篇攻略 SpringBoot是一种快速开发、简化配置的Java框架。它集成了常用的开发工具,如SpringMVC、Hibernate、MyBatis等,能够帮助开发人员快速搭建Java Web项目。本篇攻略将介绍学习SpringBoot的入门教程。 1. 安装Java和IDE 在开始学习SpringBoot之前,需要先安…

    Java 2023年5月15日
    00
  • Java String类正则操作示例

    Java String类正则操作示例 简介 Java中String类提供了很多方法进行正则表达式的操作。通过使用正则表达式,我们可以在字符串中匹配特定的字符或者模式,进行替换或者搜索等操作。在这篇文章中,我们将学习String类操作正则表达式的方法,并且提供两个实际的示例说明。 String类操作正则表达式的方法 Java String类提供了以下方法来操作…

    Java 2023年5月27日
    00
  • JavaSpringBoot报错“MethodArgumentTypeMismatchException”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“MethodArgumentTypeMismatchException”错误。这个错误通常是由以下原因之一引起的: 参数类型不匹配:如果控制器方法的参数类型与请求参数类型不匹配,则可能会出现此错误。在这种情况下,需要确保控制器方法的参数类型与请求参数类型匹配。 参数格式不正确:如果请求参数格式不正确,…

    Java 2023年5月5日
    00
  • layui table 表格模板按钮的实例代码

    本次我们简单介绍一下“layui table 表格模板按钮的实例代码”的完整攻略。 1. 基础设置 首先,我们需要引入layui框架中的table.js和laytpl.js文件。安装起来方法也非常简单,只需要执行以下代码即可。 <script src="lay/modules/table.js"></script>…

    Java 2023年6月15日
    00
  • 搭建MyBatis-Plus框架并进行数据库增删改查功能

    搭建MyBatis-Plus框架并进行数据库增删改查功能的完整攻略如下: 准备工作 下载和安装JDK和MySQL; 创建一个Spring Boot项目; 在项目中添加mybatis-plus-boot-starter依赖; 在项目的配置文件中配置数据库连接信息。 配置MyBatis-Plus框架 创建数据库表; 创建实体类,并在类上添加@TableField…

    Java 2023年6月1日
    00
  • 一文详解Java闭锁和栅栏的实现

    一文详解Java闭锁和栅栏的实现 1. 什么是闭锁和栅栏 在并发编程中,有时需要等待某个操作的完成,或者协调多个线程的执行。Java提供了闭锁(Latch)和栅栏(Barrier)两个机制来实现这种协调。 闭锁是一种同步工具,可以使线程等待一个或多个线程的操作完成。闭锁一般会在某个线程等待另一个线程完成任务时使用。 栅栏是一种同步工具,它允许一组线程在某个点…

    Java 2023年5月26日
    00
  • Eclipse如何导入Maven项目详解(新手初学)

    Eclipse如何导入Maven项目详解(新手初学) 对于新手初学者来说,使用Eclipse导入Maven项目并不是一件容易的事。下面将详细讲解如何导入Maven项目。 步骤一:安装Maven插件 在Eclipse中安装Maven插件,插件名称为”Maven Integration for Eclipse”。安装方法如下: 打开Eclipse,点击“Help…

    Java 2023年5月20日
    00
  • Java springboot 配置文件与多环境配置与运行优先级

    Java Spring Boot 是一个轻量级、快速开发微服务架构的框架,它提供了一种快速简便的方式来配置应用程序。不同的环境需要不同的配置,因此Spring Boot提供了多环境配置功能,同时我们也可以在配置文件中定制应用程序的运行优先级。 1. 配置文件 Spring Boot 提供了多种配置文件的支持,其中最常用的是 application.prope…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部