1、流程概述
如上,交易系统会对接很多不同的第三方扣款服务,比如说paypal、onekpay等。交易系统向第三方扣款服务发出请求,然后会收到对应的信息。下层服务包含两个方法,链式调用,也就是第一个方法出错的话,第二个方法也会出错。比如说返回的是json信息,就会对这个json信息解析并处理。但是由于第三方服务的不可控,假如返回了一些非json数据的context,就会导致解析失败,返回null,但不会停止。这个错误的context会继续往下传递,进入到下一个方法,这个方法对这个错误的context处理,从而产生空指针。
所以会导致两个异常:1、第一个方法解析完json得到null,这个null会在被第一个方法的引用中报空指针;2、链式调用,两个方法虽然不会相互调用,但是都是用的同一个context,第一个方法的context已经有问题,所以第二个方法在context的处理上也会出问题,报空指针异常。
我方希望:1、屏蔽掉空指针异常,但如果情况频繁还是要上报;2、假如第一个方法出问题则直接终止链式任务。
2、简单的处理方法
在链式任务开始之前对context做判断,假如是有问题的则抛自定义异常,从而避免了直接抛空指针异常,接着返回,从而避免了链式任务的继续执行。
3、抽象的处理方法
上面的方法虽然简单有效,但有没有办法抽象出来。假如链式方法中出现了别的错误,我们同样希望对抛出自定义异常同时终止链式任务,那应该如何处理?
首先我们定义一个自定义非检查异常ChannelStopException,用于表示链路必须停止的异常,然后再定义一个ChannelMesAnalysisfailException,用于表示报文解析错误的异常,也就是上面讲的第一个链路方法中可能会出现的异常,同时继承ChannelStopException。
public class ChannelStopException extends RuntimeException