В сопрограммах Kotlin вызов async
не будет генерироваться, пока значение не будет получено. Однако, когда я запускаю функцию приостановки в блоке async
, исключение не перехватывается, как я ожидал.
Вот пример кода:
fun start() {
GlobalScope.launch {
try {
val def1 = async { doWork1() }
val def2 = async { doWork2() }
Log.d("test", "Result ${def1.await()}, ${def2.await()}")
} catch (ex: Exception) {
Log.e("test", "Error", ex)
}
}
}
private suspend fun doWork1(): Int {
delay(1000L)
throw Exception("work 1")
}
private suspend fun doWork2(): Int {
delay(1000L)
return 1
}
Это происходит сбой вместо перехвата исключения в блоке catch
.
С другой стороны, это прекрасно работает
fun start() {
GlobalScope.launch {
try {
val value = doWork1()
Log.d("test", "Result: $value")
} catch (ex: Exception) {
Log.e("test", "Error", ex)
}
}
}
private suspend fun doWork1(): Int {
delay(1000L)
throw Exception("work 1")
}
Почему исключения не попадают в ловушку в первом примере?