Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
#Kotlin #Coroutines #Exceptions

Managing exceptions in nested coroutine scopes

Обработка исключений при выполнение вложенных корутин не так очевидна как кажется и имеет свою специфику.

Например, что будет записано в файл в результате выполнения кода?
GlobalScope.launch {
val text = try {
async<String> {
throw Exception("Test")
}.await()
} catch (e: Exception) {
"error text"
}
writeToFile(text) // Suspend function
}

Правильный ответ - ничего.

Причиной тому особенности Structured Concurrency. Когда происходит исключение в async то происходит следующее:
оно передаётся во все родительские и дочерние корутины, которые останавливают свое выполнение, а те в свою очередь останавливают все корутины по аналогичному принципы.

Замечание: Здесь опущена возможность, что можно задать свой собственный CoroutineExceptionHandler в CoroutineContext

Есть несколько способ обойти это:
👉 При создание CoroutineScope используйте SupervisorJob, которая не останавливает дочерние корутины
👉 Для переключения CoroutineContext используйте withContext() вместо launch/async
👉 Выполняйте корутины, который бросают исключения в отдельной CoroutineScope. Создать такой scope можно с помощью функции coroutineScope()

Больше подробностей ищите в статье!
👍1