在 try catch 块崩溃时启动协程

Launch coroutine in try catch block crashes

我无法理解这两个函数之间的区别。为什么 func2 崩溃程序而 func1 可以捕获异常?

fun main() {
    runBlocking {
        func1() //Prints exception
        func2() //Program crashes
    }
}

fun CoroutineScope.func1() {
    launch {
        try {
            throw IllegalArgumentException("error")
        } catch (t: Throwable) {
            println(t)
        }
    }
}

fun CoroutineScope.func2() {
    try {
        launch {
            throw IllegalArgumentException("error")
        }
    } catch (t: Throwable) {
        println(t)
    }
}

“启动”块中的代码在具有不同上下文的单独协程上运行。外部 try/catch 无法捕获发生的异常。你需要在一个块中有 try/catch,就像你的 func1.