Sobes.tech
Junior — Middle

Jak zachytit výjimky při spuštění korutin pomocí try/catch, umístěného mimo funkci launch?

sobes.tech AI

Odpověď od AI

V Kotlinu nelze zachytit výjimky, které vzniknou uvnitř korutin, běžným try/catch, pokud jsou umístěny mimo funkci launch, protože launch spouští korutinu asynchronně a okamžitě vrací objekt Job, a výjimky již vznikají v jiném kontextu.

Pro zpracování výjimek je třeba používat obsluhovače uvnitř korutiny nebo speciální mechanismy:

  • Použít CoroutineExceptionHandler při vytváření kontextu korutiny.
  • Zpracovávat výjimky uvnitř samotné korutiny pomocí try/catch.
  • U korutin spuštěných přes async lze výjimku zachytit při volání await().

Příklad s CoroutineExceptionHandler:

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

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

job.join()

Tímto způsobem try/catch mimo launch nefunguje, je třeba zachytit ji uvnitř korutiny nebo použít CoroutineExceptionHandler.