前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK错误用法——throwable.getCause

JDK错误用法——throwable.getCause

作者头像
早安嵩骏
发布2020-08-11 16:22:35
6140
发布2020-08-11 16:22:35
举报
文章被收录于专栏:程序猿人程序猿人

最近上线发现一个恶心的问题,就是 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。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档