前言最近上的一个版本中 , 突然bugly的JAVA异常一个都没有了 , 正好升级了bugly的版本 , 还以为接入有问题 , 排查一些正常 , 特自信的说版本代码优秀…0 bug~~~
可是后面细想几百万的DAU , 一个Java异常都没有都没有 , 这太不正常了 。
目前项目中捕获全局异常的有:bugly、umeng、自己 。
排查bugly的捕获异常代码实现
文件路径:com.tencent.bugly.crashreport.crash.a
文章插图
设置全局异常捕获
保存之前的UncaughtExceptionHandler , 将自己设置为默认异常处理器Thread.setDefaultUncaughtExceptionHandler(this)
文章插图
异常捕获
文章插图
异常分发
对捕获异常做分发
umeng的捕获异常代码实现文件路径:com.umeng.analytics.pro.l
文章插图
【Android中的线程捕获】
umeng的UncaughtExceptionHandler
实现逻辑和bugly类似
自己的捕获异常代码实现
文章插图
自己的UncaughtExceptionHandler
问题定位:handleException笔误写错了!处理 , 导致之前默认异常处理未被调用 , 而且自己异常捕获写在最后 , 覆盖了之前的异常捕获
建议为了避免此种问题再次发生 , 对异常捕获可以参考以下代码进行扩展
public class CrashHandler implements Thread.UncaughtExceptionHandler { private final Thread.UncaughtExceptionHandler mDefaultHandler; public CrashHandler() { //缓存之前的默认异常捕获 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread t, Throwable e) { //分发异常 if (mDefaultHandler != null) { mDefaultHandler.uncaughtException(t, e); } //TODO 自己处理 Log.w("CrashHandler", e); }}当然最简单的方式是将自己的UncaughtExceptionHandler写在bugly和umeng的前面 , 让bugly和umeng分发异常给自己 , 但是你也不能保证你前面就没有其他的异常捕获监听 , 所以还是建议用上述方法 。
扩展
- Java中并不是所有的异常都会提示try-catch进行捕获的 , 比如RuntimeException
- 线程是独立执行的代码片断 , 线程的问题应该由线程自己来解决 , 而不要委托到外部 。
- 对象方法
- 用于指定Thread的异常捕获
- 如未指定会去取ThreadPool中的异常捕获
- 只能捕获executorService.execute执行的异常
- 不能捕获executorService.submit(runnable) , 上述异常通过catch (ExecutionException e)进行捕获
- 类方法
- 用于捕获所有Thread中的异常捕获
- 如Thread指定了异常捕获 , 则不调用默认的
分享给大家的资料包括高级架构技术进阶脑图、Android开发面试专题资料 , 还有高级进阶架构资料包括但不限于【高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术】希望能帮助大家学习提升进阶 , 也节省大家在网上搜索资料的时间来学习 , 也是可以分享给身边好友一起学习的!
资料免费领取方式:私信回复“架构资料”即可获取
文章插图
推荐阅读
- 地下城与勇士|和上司关系密切,就成了上司的自己人了?小心犯了职场中的大忌
- 茶事活动与禅宗仪礼
- 普照禅茶屏南藏在深山中的禅意
- 旧物 茶席中的古朴风景令人心醉
- OPPO方面确认,Find X2系列将尝鲜Android 11
- Android网络优化篇-从DNS开始
- 采茶记
- 七剑下天山前七剑、后七剑分别是谁? 七剑下天山中的七剑是哪七剑
- 人生中的三道茶
- 总是听到有人说AndroidX,到底什么是AndroidX?