【踩坑】异常捕获的时机不正确,引发的惨痛血案

在做业务的时候犯了一个低级错误,由于异常的捕获方式没对,导致出现了一个线上偶现崩溃

来看看问题复现的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.要注意线程切换的环境变更,在实际开发中有时候嵌套很深,很容易忽略这个问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值