推荐答案
在 Kotlin 协程中,coroutineScope 和 supervisorScope 都是用于创建子协程的作用域构建器,但它们的行为在错误处理方面有所不同。
- coroutineScope:当一个子协程失败时,它会取消所有其他子协程,并且异常会传播到父协程。
- supervisorScope:当一个子协程失败时,它不会影响其他子协程,异常也不会传播到父协程。
本题详细解读
coroutineScope
coroutineScope 是一个作用域构建器,它会创建一个新的协程作用域,并且在该作用域内的所有子协程都会遵循结构化并发原则。这意味着:
- 如果其中一个子协程抛出异常,
coroutineScope会取消所有其他子协程。 - 异常会传播到父协程,导致父协程也被取消。
示例代码:
// www.javascriptcn.com code example
fun main() = runBlocking {
try {
coroutineScope {
launch {
delay(100)
throw RuntimeException("Failed coroutine")
}
launch {
delay(200)
println("This will not be printed")
}
}
} catch (e: Exception) {
println("Caught exception: $e")
}
}在这个例子中,第一个子协程抛出异常后,第二个子协程会被取消,并且异常会被捕获并打印。
supervisorScope
supervisorScope 也是一个作用域构建器,但它与 coroutineScope 的主要区别在于错误处理方式:
- 如果其中一个子协程抛出异常,
supervisorScope不会取消其他子协程。 - 异常不会传播到父协程,父协程可以继续运行。
示例代码:
// www.javascriptcn.com code example
fun main() = runBlocking {
supervisorScope {
launch {
delay(100)
throw RuntimeException("Failed coroutine")
}
launch {
delay(200)
println("This will be printed")
}
}
println("Parent coroutine continues")
}在这个例子中,第一个子协程抛出异常后,第二个子协程仍然会继续执行,并且父协程也不会被取消。
总结
- 使用
coroutineScope时,子协程的失败会导致整个作用域被取消。 - 使用
supervisorScope时,子协程的失败不会影响其他子协程,父协程也不会被取消。
根据具体需求选择合适的作用域构建器,以确保协程的错误处理符合预期。