消费者端调用服务者端的接口,服务端抛出一个自定义异常,该异常继承了RuntimeException,但是消费者端Debug发现catch到的是RpcException,RpcExcetion为dubbo的异常,为什么服务提供者的返回的是自定义异常却变成了RpcException?
原因分析:
1.方法签名上有声明.方法签名上有声明,如果这个异常是服务提供者中定义的,因为消费端是依赖接口层的,而不是依赖服务提供者.那么编译都编译不过,如果能编译得过,说明消费端是能依赖到这个异常的,因此序列化不会有问题,直接抛出
2.异常类和接口类在同一jar包里.服务提供者和消费方都依赖接口层,如果异常在这个接口层,那序列化也不会有问题,直接抛出
3.是JDK自带的异常,直接抛出服务提供方和消费方都依赖jdk,序列化也不会有问题,直接抛出
4.是Dubbo本身的异常(RpcException),直接抛出服务提供方和消费方都依赖Dubbo,序列化也不会有问题,直接抛出
5.否则,包装成RuntimeException抛给客户端.此时,就有可能出现我说的那种,这个异常是服务提供方自定义的,那么提供方抛出的时候进行序列化,因为消费方没有依赖服务提供方,所以异常到达消费端时,根本无法反序列化.但是包装成了RuntimeException异常则不同,此时异常就是JDK中的类了,到哪都能序列化.
解决方案:
规范要求业务方接口声明,例如throws 自定义异常