Sobes.tech
Junior — Middle

Ako zachytiť výnimky pri spustení korutín pomocou try/catch, umiestneného mimo funkciu launch?

sobes.tech AI

Odpoveď od AI

V Kotlinu nie je možné zachytiť výnimky, ktoré vzniknú vo vnútri korutín, bežným try/catch, ak sú umiestnené mimo funkcie launch, pretože launch spúšťa korutínu asynchrónne a okamžite vracia objekt Job, a výnimky už vznikajú v inom kontexte.

Na spracovanie výnimiek je potrebné používať spracovateľov vo vnútri korutiny alebo špeciálne mechanizmy:

  • Použiť CoroutineExceptionHandler pri vytváraní kontextu korutiny.
  • Spracovávať výnimky vo vnútri samotnej korutiny pomocou try/catch.
  • Pre korutiny spustené cez async je možné zachytiť výnimku pri volaní await().

Príklad s CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Zachytená výnimka: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Chyba v korutine")
}

job.join()

Týmto spôsobom try/catch mimo launch nebude fungovať, je potrebné ho zachytiť vo vnútri korutiny alebo použiť CoroutineExceptionHandler.