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