MST

星途 面试题库

面试题:Kotlin协程异常处理之中等难度

在Kotlin协程中,GlobalScope.launch和runBlocking启动的协程,其异常处理机制有何不同?请举例说明如何分别捕获这两种方式启动协程中的异常。
40.6万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 异常处理机制不同点

    • GlobalScope.launch:它启动的是一个顶层协程,运行在一个与应用程序生命周期绑定的作用域中。如果这个协程抛出未捕获的异常,默认情况下,它不会直接导致应用崩溃,但是会打印异常日志到控制台。这种方式适用于那些即使失败也不应该影响应用整体运行的后台任务。
    • runBlocking:它会阻塞当前线程直到其内部协程执行完毕。如果内部协程抛出异常,这个异常会直接抛给调用runBlocking的代码块,就像普通函数抛出异常一样,可能导致调用栈上的代码处理异常或者使应用崩溃(如果没有合适的异常处理)。
  2. 捕获异常示例

    • GlobalScope.launch
import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch {
        try {
            throw RuntimeException("模拟异常")
        } catch (e: Exception) {
            println("捕获到异常: $e")
        }
    }
    Thread.sleep(1000)
}

在上述代码中,通过try - catch块捕获GlobalScope.launch协程内部抛出的异常。

  • runBlocking
import kotlinx.coroutines.*

fun main() {
    try {
        runBlocking {
            throw RuntimeException("模拟异常")
        }
    } catch (e: Exception) {
        println("捕获到异常: $e")
    }
}

这里通过在调用runBlocking的外层使用try - catch块来捕获其内部协程抛出的异常。