У меня есть следующий фрагмент для тестирования:
fun main() {
val myScope = CoroutineScope(Dispatchers.Default) + Job()
myScope.launch {
val job = async {
delay(1000)
throw RuntimeException("shiiiet")
}
try {
job.await()
} catch (ret: RuntimeException){
throw RuntimeException("yooo!")
}
}
try {
Thread.sleep(5000)
} catch(e: Exception){
}
println("wohoooo!")
}
Я думал, что поток никогда не достигнет последнего "ухо!" линия, но я был неправ. Я вижу, что это напечатано на экране. Причина, по которой я думал, что launch
будет распространять исключение в родительскую область, и, поскольку родительская область не обрабатывает его, к моменту достижения оператора print она создаст sh JVM.
Это потому, что родительская область была отменена после того, как произошел сбой дочернего элемента, получено исключение CancellationException, и оно было проигнорировано?