本文主要是介绍【踩坑】异常捕获的时机不正确,引发的惨痛血案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在做业务的时候犯了一个低级错误,由于异常的捕获方式没对,导致出现了一个线上偶现崩溃
来看看问题复现的demo代码
/*** 这是一个view的扩展kotlin方法*/
private inline fun View.loadIcon(
) {thread {try {//捕获异常post {//这个地方实际上发生了线程切换,这里嵌套比较浅,容易发现,但是如果嵌套很深就很难发现了throw NullPointerException()}} catch (e: Exception) {}}.start()
}
从表面看来看起来似乎是没问题的,但是运行起来还是发生了崩溃,try-catch没有捕获成功,这是为什么呢?
主要是post 这个方法实际上post的Runnable接口是在主线程运行的,所以这个时候发生了线程切换由于try-catch的只能捕获当前线程异常,所以如果写在线程切换之前就无法正确捕获异常
既然找到原因那修改就很简单了
private inline fun View.loadIcon(
) {thread {post {try {//把异常捕获放到post里面就好了throw NullPointerException()} catch (e: Exception) {}}}.start()
}
总结:
1.try-catch只能捕获当前异常
2.要注意线程切换的环境变更,在实际开发中有时候嵌套很深,很容易忽略这个问题
这篇关于【踩坑】异常捕获的时机不正确,引发的惨痛血案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!