Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от 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.