Sobes.tech
Back to questions
Junior — Middle
68

Как обработать исключения при запуске корутин с помощью try/catch, размещенного за пределами функции launch?

Answer from AI

sobes.tech AI

В Kotlin исключения, возникающие внутри корутин, нельзя поймать обычным try/catch, если он размещён вне функции launch, потому что launch запускает корутину асинхронно и сразу возвращает объект Job, а исключения происходят уже в другом контексте.

Чтобы обработать исключения, нужно использовать обработчики внутри корутины или специальные механизмы:

  • Использовать CoroutineExceptionHandler при создании контекста корутины.
  • Обрабатывать исключения внутри самой корутины с помощью try/catch.
  • Для корутин, запускаемых через async, можно поймать исключение при вызове await().

Пример с CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Поймано исключение: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Ошибка в корутине")
}

job.join()

Таким образом, try/catch вне launch не сработает, нужно либо ловить внутри корутины, либо использовать CoroutineExceptionHandler.