Недавно я подробно изучал сопрограммы, насколько я понимаю, SupervisorJob() дает нам возможность не отменять все дочерние программы, если один из дочерних элементов сопрограммы отменен по какой-либо причине.Говорят, что сопрограммы, запущенные с помощью coroutineScope, отменяют всех дочерних программ в случае сбоя одного из них, но те, которые запущены с SupervisorScope, отменяют только дочерний элемент, в котором произошел сбой
Интересно, могу ли я изменить поведение CoroutineScope, добавив к нему SupervisorJob в качестве CoroutineContext, но я не смог получить ожидаемое поведение, чего я не получаю
Ожидаемое поведение — результаты getData1() и getData3() печатаются*
Фактическое: — getData2 () отменяет все сопрограммы
fun main() = runBlocking {
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
println(throwable)
}
val customScope = CoroutineScope(SupervisorJob() + exceptionHandler)
customScope.launch {
launch {
getData1().also { println(it) }
}
launch {
getData2().also { println(it) }
}
launch {
getData3().also { println(it) }
}
}.join()
}
private suspend fun getData1(): String? {
delay(1000)
return "data 1"
}
private suspend fun getData2(): String? {
delay(300)
throw RuntimeException("While getting Data 2 exception happened")
}
private suspend fun getData3(): String? {
delay(800)
return "data 3"
}
Подробнее здесь: https://stackoverflow.com/questions/749 ... visorscope