Sobes.tech
Назад к вопросам
Junior — Middle
74

Какими методами можно реализовать обработку исключений внутри корутин в асинхронном программировании?

Компании, где спрашивали
Ubic
RutubeRutube
trendtech

Ответ от нейросети

sobes.tech AI

В Kotlin корутинах обработка исключений может быть реализована несколькими способами:

  1. try-catch внутри корутины — самый простой способ, когда блок кода внутри корутины оборачивается в try-catch:
launch {
    try {
        // асинхронный код
    } catch (e: Exception) {
        // обработка исключения
    }
}
  1. CoroutineExceptionHandler — специальный обработчик исключений, который можно передать в контекст корутины. Он срабатывает на необработанные исключения в корутинах, запущенных через launch (но не async):
val handler = CoroutineExceptionHandler { _, exception ->
    println("Caught $exception")
}

val job = GlobalScope.launch(handler) {
    throw RuntimeException("Error")
}
  1. Обработка исключений в async/await — поскольку async возвращает Deferred, исключения нужно ловить при вызове await:
val deferred = async {
    throw RuntimeException("Error")
}

try {
    deferred.await()
} catch (e: Exception) {
    // обработка
}
  1. SupervisorJob и SupervisorScope — позволяют изолировать ошибки дочерних корутин, чтобы одна ошибка не отменяла весь родительский scope.

Таким образом, выбор метода зависит от контекста и требований к обработке ошибок.