最近上线发现一个恶心的问题,就是 vert.x 把异常日志吞掉了,异常操作全部成了超时日志(系统设置有请求超时时间)。vert.x 是一个响应式框架,它是把任务放到 eventLoop 中异步执行的,但是吞日志,这怎么能行?
经过查询发现,vert.x 还是存在统一的异常处理的,当在执行每一个任务的时候,如果 catch 住异常还是会上报给一个统一的异常处理 handler 的。如图:
而这个 handler 也正是配置vertx 对象的时候所设置的:
这就找到问题的关键了,如图,原来的代码使用了 event.getCause()方法,event 是 Throwable 类型。查看该方法:
可以看到源码是判断 cause 和自身是否相等,如果相等则返回 null,如果不等则返回 cause;
注释的意思是:如果它的”cause“存在则返回这个异常的”cause“,否则返回空(”cause“是”throwable 发生的原因“)这个方法返回了由其他几个以 Throwable 类型参数的构造方法,或者”initCause(Throwable)“方法设置的”cause“。虽然通常不需要重写此方法,但子类可以重写此方法以通过其他方式返回原因集。这适用于将异常原因加到”Throwable“所形成的的“遗留链式抛出”。注意,所有调用 getCause 方法来确定抛出的原因的 PrintStackTrace 方法不需要重写。
所以,以下是修改方案:
阿门,愿世间没有bug。