Как перехватывать Exception в Coroutine. Часть 3
Факты, которые нам понадобятся:
• корутина верхнего уровня — корутина, чьим родителем является Scope, а не другая корутина
scope.launch { — верхнего уровня
launch { } — не верхнего
}
• CoroutineExceptionHandler — получатель необработанных ошибок
Его можнно назначить в конструкторе Scope или в билдере launch() верхнего уровня, если его родитель Scope(SupervisorJob)
• два понятия, которые нельзя путать:
throws (выбрасывать)
если ошибка выброшена, то она поднимается по стеку вызова функций, пока не попадется в try-catch или Thread.UncaughtExceptionHandler
propagate (распространять)
если ошибка распространяется, то она игнорирует блоки try-catch и передается от дочерний корутины к родителю
если ошибка добралась до коренного Scope, а у него не установлен CoroutineExceptionHandler, то ошибка передается в Thread.UncaughtExceptionHandler
• при создании Scope можно назначить два вида Coroutine Context:
Job — если внутри Scope появляется ошибка, не перехваченная try-catch, то Scope завершает работу всех дочерних корутин, завершается сам и распространяет ошибку
SupervisorJob — если внутри Scope появляется ошибка, не перехваченная try-catch, то Scope распространяет ошибку, не завершая дочерние корутины и себя
• CancellationException — особый вид ошибки. Выбрасывается, когда корутина была остановлена с помощью cancel()
Она, в отличие от остальных ошибок, не останавливает родительский Scope и не влияет на работу остальных корутин в Scope
....
если какой-то из пунктов вызывает вопросы — готов расписать подробнее в комментариях)
и нам наконец хватает знаний, чтобы перейти к практике в следующем посте
Post #75
2.6K