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日

相关文章

  • 详解Java中的Lambda表达式

    详解Java中的Lambda表达式完整攻略 概述 Lambda表达式是Java 8的重要特性,它可以让代码更加简洁易懂。它允许我们使用一种新的简洁语法来定义匿名内部类,从而更容易地编写具有函数式风格的代码。 Lambda表达式的语法 Lambda表达式的语法非常简单。它由一个箭头符号“->”(英文的“right arrow”)组成,左边是参数列表,右边…

    Java 2023年5月26日
    00
  • Java基础之Maven详解

    Java基础之Maven详解 什么是Maven? Maven 是一个项目建立,依赖管理以及项目生命周期管理的工具。使用 Maven 可以很方便地构建、打包、发布和管理 Java 项目。 Maven的工作原理 Maven 的工作原理是:在项目的根目录创建一个名为 pom.xml 的文件,它是 Maven 的核心文件,其中定义了以下信息: 项目的基本信息,比如名…

    Java 2023年5月19日
    00
  • php使用curl模拟登录后采集页面的例子

    下面是php使用curl模拟登录后采集页面的攻略。 1. 了解curl模拟登录的基本原理 在使用curl模拟登录之前,需要了解一下基本的原理。curl是一个命令行工具,能够通过HTTP或FTP发送请求并获取资源,同时也可以通过数据请求来模拟登录网站。 登录页面的基本原理是通过向服务器发送用户名和密码进行验证,然后在浏览器中直接跳转到用户主页。使用curl模拟…

    Java 2023年6月15日
    00
  • spring boot中的properties参数配置详解

    让我来详细讲解“spring boot中的properties参数配置详解”的攻略。 什么是Properties文件? 在Spring Boot中,我们可以使用properties文件来配置应用程序的属性和参数。Properties文件通常存储在src/main/resources目录下,它可以是单个文件,也可以是多个文件,每个文件都以.properties…

    Java 2023年5月19日
    00
  • Session过期后实现自动跳转登录页面

    要实现Session过期后自动跳转到登录页面,需要进行以下步骤: 1. 设置Session过期时间 在服务器端的配置文件中设置Session过期的时间,例如设置为30分钟。具体的配置方式可以因服务器而异,例如在PHP中可以通过php.ini文件中的session.gc_maxlifetime参数来设置过期时间。在JAVA中可以通过web.xml文件或者代码来…

    Java 2023年6月16日
    00
  • 解决spring data jpa saveAll() 保存过慢问题

    解决 Spring Data JPA saveAll() 保存过慢问题需要从以下两个方面入手: 批量操作 对于需要批量插入的数据,如果使用 JPA 的 saveAll() 方法,会对每个实体执行一次数据库操作,这样的效率会非常低下。因此,需要使用批量操作。在 Spring Data JPA 中,可以使用 JPA 提供的批量操作接口 Batch批量操作,方法为…

    Java 2023年5月20日
    00
  • jQuery 重复加载错误以及修复方法

    jQuery 重复加载错误以及修复方法 在使用jQuery的过程中,经常会遇到jQuery重复加载的错误。这个错误一般是因为我们在多个地方重复引用了jQuery库导致的。下面,我们就来详细讲解如何避免和解决这个问题。 什么是jQuery重复加载错误 当我们在页面中引用jQuery库时,如果多个地方都引用了jQuery库,那么就会发生jQuery重复加载的错误…

    Java 2023年6月15日
    00
  • Java进阶学习:网络服务器编程

    Java进阶学习:网络服务器编程 Java进阶学习中,网络服务器编程是非常关键的一部分。本文将介绍网络服务器编程方面的完整攻略,包括必要的基础知识,如何创建网络服务器,如何创建服务器/客户端,以及一些实例说明。 1. 基础知识 在进行网络服务器编程之前,需要掌握以下基础知识: TCP/IP 协议 Socket 编程 多线程编程 TCP/IP协议是 Inter…

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