在做业务的时候犯了一个低级错误,由于异常的捕获方式没对,导致出现了一个线上偶现崩溃
来看看问题复现的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.要注意线程切换的环境变更,在实际开发中有时候嵌套很深,很容易忽略这个问题