У меня возникли проблемы с вычислением обработки ошибок с сопрограммами, которые я сузил до этого модульного теста с помощью следующих шагов:
- Я создаю область сопрограмм с любым диспетчером.
- Я выкидываю исключение в любом месте этой области в асинхронном блоке (или даже во вложенном асинхронном блоке).
- Я вызываю await для возвращенного отложенного значения и обрабатываю исключение.
Все в порядке.Однако когда я пытаюсь использовать одну и ту же область сопрограмм для запуска новой сопрограммы, она всегда завершается исключительно с тем же исключением.
Вот тест:
fun `when you throw an exception in a coroutine scope, is the coroutine scope dead?`() {
val parentJob = Job()
val coroutineScope = CoroutineScope(parentJob + Dispatchers.Default)
val deferredResult = coroutineScope.async { throw IllegalStateException() }
runBlocking {
try {
deferredResult.await()
} catch (e: IllegalStateException) {
println("We caught the exception. Good.")
}
try {
coroutineScope.async { println("we can still use the scope") }.await()
} catch (e: IllegalStateException) {
println("Why is this same exception still being thrown?")
}
}
}
Вот результат теста:
We caught the exception. Good.
Why is this same exception still being thrown?
Примечание. Я использую Kotlin 1.3