Как перехватывать Exception в Coroutine. Часть 4
Разберемся с билдером launch
Рабочие способы перехватить ошибки:
• внутри launch
launch {
try {
throw Exception()
} catch(e: Exception) {}
}
• с помощью перехватчика необработанных ошибок, установленного в Scope или launch верхнего уровня
scope.launch(handler) {
throw Exception()
}
СoroutineScope(handler) {
launch {
throw Exception()
}
}
в этом способе важно понимать — если родитель Scope(Job), дети этого Scope будут остановлены
если родитель Scope(SupervisorJob), дети этого Scope продолжат работу
если родитель корутина, то дети этой корутины будут остановлены в любом случае
Что будет, если не обработать:
ошибка будет распространена родительским корутинам и Scope, пока не попадет в CoroutineExceptionHandler или Thread.UncaughtExceptionHandler
Что не получится сделать:
• обернуть launch в try-catch
такое не сработает:
try {
launch { throw Exception() }
} catch(e: Exception) {}
потому что launch распространяет ошибку родителю, а не выбрасывает
....
если вы встретили примеры, в которых не очевидно поведение корутин при возникновении ошибки — скидывайте их в комментарии, разберем)
Post #76
3.04K