Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
zhh-4096 2019-12-28 00:00:00 发布的技术动态 - OurCoders (我们程序员)
zhh-4096
2019-12-28 00:00:00 发布
对一个大中型系统进行异步化后如何优雅的处理异常?这是一个挺刺手的问题。不管是vert.x通过AsyncResult用if else判断成功或失败,还是RxJava那种为成功失败单独弄链式风格的处理器,代码规模大了之后都是很繁琐的。

我不想每次异步调用都处理一次异常情况,只关心正常的结果,然后在某个局部或全局的地方捕获异常,同时错误堆栈要能方便查找问题,尽可能像同步调用产生的异常那样直观。

如果调用异步方法的线程和执行回调的线程不是同一个,在后者中抛出的异常堆栈是极其难排查原因的,上下文已经丢失了。特别是数据库这类场景,需要在客户端把服务器端传回来的异常堆栈跟客户端自己的调用链衔接起来才来得到完整的信息。

当然也有一种办法就是在执行异步方法前就把当前的调用栈构建出来了,然后保存到回调的闭包当中,但是无条件事先构建调用栈会有一点性能损失,并且在绝大多数调用成功的场景下都是没必要的。