Как видно из заголовка, почему функции приостановки генерируют исключения в finally
?
Со стандартными функциями блок finally
выполняет все из них:
import kotlinx.coroutines.*
fun main() {
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
val job = GlobalScope.launch(handler) {
launch {
// the first child
try {
println("inside try")
delay(1000)
} finally {
println("Children are cancelled, but exception is not handled until all children terminate")
Thread.sleep(1000)
println("thread.sleep executed")
//foo()
println("The first child finished its non cancellable block")
}
}
launch {
// the second child
delay(10)
println("Second child throws an exception")
throw ArithmeticException()
}
}
Thread.sleep(1000000)
println("complete")
}
Здесь, например, когда я делаю Thread.sleep(1000)
, он печатает:
«Первый дочерний элемент завершил свой неотменяемый блок»
, но если я изменю эту строку на delay(1000)
, это не так.
Насколько я понимаю, в finally
-блоке исключение, если оно существует, выдается после выполнения всего блока.
Но в этом случае delay
приводит к тому, что это исключение выдается рано.
С другой стороны, Thread.sleep
нет.
Может кто-нибудь помочь объяснить?