dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

 更新时间:2023年03月21日 11:25:03   作者:自东向西  
这篇文章主要介绍了dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

问题

开发过程中,发现服务提供者抛出了自定义的BusinessException,到了消费者这边,却变成了RuntimeException。

客户端这边有BusinessException这个类,提供者抛出的也是这个类的异常,为什么会被转成RpcException呢?

代码分析

看ExceptionFilter的代码:

重点就在圈起来的3个地方:

1、有异常,而且接口不能是GenericService才需要判断是否需要转换成RuntimeException,不然直接返回result。

2、如果是受检异常,则不转换,直接返回。

3、如果不是受检异常,则需要判断该异常是否在方法上声明抛出,如果有声明就不转换,直接返回。

如果不是上面的这三种情况,就会去到兜底逻辑:

兜底判断也是有三点:

1、判断接口和异常是否在一个jar包中,如果是在一个jar包,不需要转换成RuntimeException。

2、如果异常是java异常,不需要处理。

3、异常类型是RpcException,不需要处理。

如果这三者都不满足,就会到达代码:

return new RpcResult(new RuntimeException(StringUtils.toString(exception)));

异常会被转成字符串,作为RuntimeException的构造函数入参。

结论

由于BusinessException是在一个通用工具包中,和接口不在一个jar包中,BusinessException也不是受检异常,所以不满足不转换的条件。

要让提供者抛出的异常不被转成RuntimeException,可以在定义方法的时候,声明 throws BusinessException。

思考

为什么dubbo要这样判断是否需要转成RuntimeException呢?

个人觉得,依据是消费者能否反序列化成对应的异常类,消费端有抛出的这个异常类,就能成功反序列化。

1、能抛出受检异常,那么在方法上必然声明了抛出该异常,客户端包里会有该异常类

2、同理,如果不是受检异常,但是在方法上声明了,客户端也会有

3、如果接口和异常类是在同一个jar吧,说明客户端包里有异常类

4、jdk自己的异常类,自然是存在的

5、RpcException是dubbo自己的异常类,消费者必然也有

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java equals函数用法详解

    java equals函数用法详解

    java 中equals函数的使用方法是广大java爱好者所关心的一个话题,本文将详细介绍其使用方法,需要了解的朋友可以参考下
    2012-11-11
  • Eclipse中安装反编译工具Fernflower的方法(Enhanced Class Decompiler)

    Eclipse中安装反编译工具Fernflower的方法(Enhanced Class Decompiler)

    这篇文章主要介绍了Eclipse中安装反编译工具Fernflower的方法(Enhanced Class Decompiler),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Swing常用组件之单选按钮和复选框

    Swing常用组件之单选按钮和复选框

    Swing是一个用于开发Java应用程序用户界面的开发工具包,这篇文章主要介绍了Swing常用组件之单选按钮和复选框,感兴趣的朋友可以参考一下
    2016-05-05
  • AQS同步组件CyclicBarrier循环屏障用例剖析

    AQS同步组件CyclicBarrier循环屏障用例剖析

    这篇文章主要为大家介绍了AQS同步组件CyclicBarrier循环屏障用例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 使用Java的Graphics类进行绘图的方法详解

    使用Java的Graphics类进行绘图的方法详解

    这篇文章主要介绍了使用Java的Graphics类进行绘图的方法,是Java的GUI编程的基础,需要的朋友可以参考下
    2015-10-10
  • 初探Java内部类的使用

    初探Java内部类的使用

    Java内部类一般可以分为以下三种:成员内部类、静态内部类和匿名内部类。这篇文章主要带大家初探一下Java内部类的使用,感兴趣的可以了解一下
    2022-09-09
  • SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发、提高效率,这篇文章给大家介绍MyBatis Plus整合封装的实例详解,感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • Java如何获取JSON中某个对象的值

    Java如何获取JSON中某个对象的值

    这篇文章主要介绍了Java如何获取JSON中某个对象的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringCloud Zuul基本使用方法汇总

    SpringCloud Zuul基本使用方法汇总

    这篇文章主要介绍了SpringCloud Zuul基本使用方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Mybatis choose when用法实例代码

    Mybatis choose when用法实例代码

    本文通过实例代码给大家介绍了Mybatis choose when用法,需要的的朋友参考下吧
    2017-06-06

最新评论