Почему SupervisorJob отменяте все дочерние корутины когда возникает ошибка?
Есть два типа задач в корутинах:
- Job
- SupervisorJob
Первый тип предназначен для отмены всех дочерних корутин, как только возникает ошибка в одной из них. Но есть SupervisorJob который предназначен для противоположной работы: после возникновения ошибки в одной из дочерних корутин остальные должны продолжать свою работу.
код:
fun main() {
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
println("Caught exception: $throwable")
}
val scope = CoroutineScope(SupervisorJob())
scope.launch(exceptionHandler) {
launch {
println("Starting coroutine 1")
delay(100.milliseconds)
throw RuntimeException()
}
launch {
println("Starting coroutine 2")
delay(1.seconds)
println("Coroutine 2 completed")
}
}
Thread.sleep(3000)
}
Логи:
Starting coroutine 1
Starting coroutine 2
Caught exception: java.lang.RuntimeException
Process finished with exit code 0
Есть родительская корутина и две дочерние. Ошибка возникла в первой дочерней корутине, и согласно логу мы видим, что вторая корутина не заканчивает роботу никогда (хотя должна была).
Что у меня упущено здесь?