今天提到了一个异常相关的概念——异常链,也就是下层抛出的 异常经由try - catch 处理转换成一种上层需要的异常。比如提到的下面这个AbstractSequentialList类中找不到对应的element,下层抛出NoSuchElementException转换成为了上层List中需要的IndexOutOfBoundsException。
这种处理从概念来说很好,因为很多时候代码复用会导致我们不知道这一次的调用和设计API的初衷是否相同。就像昨天下午分享提到的,在前台页面添加的功能越来越多,导致后台代码会出现一些问题,而本身方法的调用也越来越泛滥,修改其中一个地方容易引起Bug。所以很多下层引起的问题,就应该先在下层解决,不应该再由上层过多处理。
但是从我们系统本身出发,一方面是很多异常其实都是业务上的数据或者业务逻辑带来的,而我们本身有一套errorCode来表示对应的异常,在transaction运行的最后会对OperationResult进行统一翻译处理,这一部分的业务异常就不需要过多考虑。另一方面则是系统框架或者Java本身运行的一些异常,比如乐观锁,在一些接口中触发乐观锁抛出的错会在下面判断转换成可以被retry的异常,交由上层判断是否重发。这一部分的内容就可以考虑使用异常链。
至于后面第75条提到的包含失败信息,上面也有提到一个是业务报错,自有对应的代码处理。而其他异常在transaction中也会使用getCause的方法获取具体内容。