MST

星途 面试题库

面试题:Kotlin异常处理与协程的协同优化

在一个Kotlin的协程应用中,存在多个并发的协程任务,部分协程可能会抛出异常。要求设计一种机制,当其中一个协程抛出异常时,其他相关协程能够优雅地取消,并且能够统一收集和处理所有协程抛出的异常,同时要考虑到性能和资源的合理释放,阐述你的设计思路并给出关键代码示例。
43.7万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用CoroutineScope来管理协程:通过创建一个CoroutineScope,在该作用域内启动所有相关协程,这样当需要取消协程时,可以统一操作。
  2. 异常处理:使用try - catch块来捕获单个协程内的异常,然后通过GlobalScope.cancel()方法取消整个CoroutineScope,从而取消所有相关协程。同时,可以使用一个MutableList来收集所有抛出的异常。
  3. 性能和资源释放:Kotlin的协程机制本身就轻量级,通过正确使用CoroutineScopeJob,在取消协程时,Kotlin会自动释放相关资源。

关键代码示例

import kotlinx.coroutines.*

fun main() = runBlocking {
    val exceptionList = mutableListOf<Throwable>()
    val coroutineScope = CoroutineScope(Job())

    val job1 = coroutineScope.launch {
        try {
            // 模拟协程任务
            delay(1000)
            println("Job 1 is running")
            throw RuntimeException("Job 1 exception")
        } catch (e: Throwable) {
            exceptionList.add(e)
            coroutineScope.cancel()
        }
    }

    val job2 = coroutineScope.launch {
        try {
            // 模拟另一个协程任务
            delay(2000)
            println("Job 2 is running")
        } catch (e: Throwable) {
            exceptionList.add(e)
            coroutineScope.cancel()
        }
    }

    job1.join()
    job2.join()

    if (exceptionList.isNotEmpty()) {
        println("Collected exceptions:")
        exceptionList.forEach { println(it.message) }
    }
}

在上述代码中:

  1. 首先创建了一个CoroutineScope,并在该作用域内启动了两个协程job1job2
  2. 每个协程内部使用try - catch块捕获异常,捕获到异常后将异常添加到exceptionList,并取消整个CoroutineScope,从而取消所有相关协程。
  3. 最后,在所有协程执行完毕后,检查exceptionList,如果有异常则统一处理。