更新时间:2022-03-18 11:58:48 来源:极悦 浏览1820次
我们的项目使用了dubbo进行不同系统之间的调用。
每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException)。
全局的异常处理会根据不同的异常类型进行不同的处理。
最近我们发现,某个系统调用dubbo请求,provider端(服务提供方)抛出了自定义的业务异常,但consumer端(服务消费方)拿到的并不是自定义的业务异常。
这是为什么呢?还需要从dubbo的ExceptionFilter说起
我们来看看dubbo官方文档的推荐处理方式是什么
从上面我们可以看出,dubbo的处理方式主要是:
1. 如果provider实现了GenericService接口,直接抛出
2.如果是checked异常,直接抛出
3.在方法签名上有声明,直接抛出
4.异常类和接口类在同一jar包里,直接抛出
5.是JDK自带的异常,直接抛出
6.是Dubbo本身的异常,直接抛出
7.否则,包装成RuntimeException抛给客户端
接下来我们来测试一下
我们自定义一个SelfException
在服务端中抛出一个自定义的异常
启动服务对并对服务端进行访问,我们可以发现
服务端的日志
客户端的日志
可以看出, 我们这里并没有抛出自定义的异常, 从而会导致客户端没有捕捉到自定义的异常.
如何正确捕获业务异常
抛出一个自定义异常有这么麻烦吗? 主要原因是dubbo没有支持的原因.
既然这样,我们把dubbo变的支持不就可以了?
是的.把源码改一下就OK了.如下:
或者直接将117行的RuntimeException替换成自己的自定义异常!这样就从根本上解决了异常处理的问题.后续有其他问题,也可以直接修改。
通过上述相信大家对Dubbo的异常处理已经有所了解,大家如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下极悦的Java极悦在线学习,里面的课程内容从入门到精通,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习