MST
星途 面试题库

面试题:Kotlin协程中取消协程时异常处理机制

在Kotlin协程中,当我们主动取消一个协程时,异常是如何处理的?请举例说明try - catch块在这种情况下是如何起作用的。
34.3万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 异常处理机制
    • 在Kotlin协程中,当主动取消一个协程时,会抛出 CancellationException。这个异常是一种特殊类型的 Throwable,它表示协程被取消。通常情况下,CancellationException 不会向上传播到外层的 try - catch 块,除非协程正在执行一些无法取消的操作(例如一些阻塞I/O操作,没有正确处理取消信号)。
  2. try - catch 块的作用示例
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000) // 模拟一个可以被取消的操作
            println("This will not be printed if the coroutine is cancelled before 1000 ms")
        } catch (e: CancellationException) {
            println("Caught CancellationException: ${e.message}")
        } finally {
            println("Finally block always executes, even if the coroutine is cancelled")
        }
    }
    delay(500)
    job.cancel() // 取消协程
    job.join()
    println("Main function finished")
}

在上述代码中:

  • 协程内部使用 try - catch 块来捕获 CancellationException。当协程在 delay(1000) 期间被取消时,CancellationException 会被捕获,打印相应的消息。
  • finally 块会始终执行,无论协程是正常完成还是被取消。
  • 外层的 runBlocking 协程会等待被取消的协程 job 执行完毕,然后打印 “Main function finished”。