uncaughtExceptionHandler让协程抛出异常?

来源:12-9 案例:仿官方框架实现异常处理

慕前端9039556

2020-11-13

类 StandardCoroutine 中的 it.uncaughtExceptionHandler.uncaughtException(it, e) 到底是什么意思?在网上也没搜到啥靠谱的答案。

为啥他会令resumeWithException 后协程抛出异常崩溃掉?

class StandardCoroutine(context: CoroutineContext) : AbstractCoroutine<Unit>(context) {
    override fun handleJobException(e: Throwable): Boolean {
        context[CoroutineExceptionHandler]?.handleException(context, e) ?:
                Thread.currentThread().let {
                    it.uncaughtExceptionHandler.uncaughtException(it, e)
                }
        return true
    }
}

这是简单的测试代码

suspend fun main(){
    log(1)
    val job = GlobalScope.launch{
        log(2)
        val s: String  = demo2()
        log(s)
    }
    job.join()
    log(5)
}

suspend fun demo2() = suspendCoroutine<String> { c ->
    thread{
        Thread.sleep(1000)
        c.resumeWithException(Exception("test 500"))
    }
}

上面的例子中如果注释掉 it.uncaughtExceptionHandler.uncaughtException(it, e),那么就不会抛出异常。反之就抛异常。

而根据分析BaseContinuationImpl=>resumeWith函数,分析可知 resumeWithException 操作并不会导致抛异常。

 


写回答

1回答

bennyhuo

2020-11-13

CoroutineLite也有对应的实现,其实就是先判断当前作用域内有没有一场处理器,如果没有,就调用所在线程的异常处理器,线程默认的异常处理器被调用了就是这个结果。

可以去看下CoroutineLite的异常处理实现。

0
4
慕前端9039556
非常感谢!
2020-11-17
共4条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1795 学习 · 488 问题

查看课程