Dubbo异常处理
1. 问题
在使用Dubbo进行系统间的调用的时候,我们有时候可能会遇到这样的问题:服务提供者抛出了自定义的业务异常,但是服务消费者接收到的却是RunTimeException。这是为什么呢?这就得从Dubbo的ExceptionFilter说起。
2. ExceptionFilter源码分析
com.alibaba.dubbo.rpc.filter.ExceptionFilter ,实现 Filter 接口,异常过滤器实现类。代码如下:
3. 测试一下
自定义一个SelfException
定义一个接口
定义provider
定义consumer
测试结果
4. 如何正确捕获业务异常
- 修改ExceptionFilter的源码,抛出自定义异常。最好是定义一个白名单,白名单里面的异常是可以直接抛出的
String className = exception.getClass().getName();
if (className.startsWith("java.") || className.startsWith("javax.")) {
return result;
}
// directly throw if it's dubbo exception
if (exception instanceof RpcException) {
return result;
}
//在这里添加我自己定义的异常类
if (exception instanceof SelfException) {
return result;
}
- 自定义Exception类和接口在同一个package中