#Kotlin #Coroutines #Exceptions
Managing exceptions in nested coroutine scopes
Обработка исключений при выполнение вложенных корутин не так очевидна как кажется и имеет свою специфику.
Например, что будет записано в файл в результате выполнения кода?
Правильный ответ - ничего.
Причиной тому особенности Structured Concurrency. Когда происходит исключение в
оно передаётся во все родительские и дочерние корутины, которые останавливают свое выполнение, а те в свою очередь останавливают все корутины по аналогичному принципы.
Замечание: Здесь опущена возможность, что можно задать свой собственный CoroutineExceptionHandler в CoroutineContext
Есть несколько способ обойти это:
👉 При создание CoroutineScope используйте SupervisorJob, которая не останавливает дочерние корутины
👉 Для переключения CoroutineContext используйте withContext() вместо launch/async
👉 Выполняйте корутины, который бросают исключения в отдельной CoroutineScope. Создать такой scope можно с помощью функции coroutineScope()
Больше подробностей ищите в статье!
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