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
CoroutineExceptionHandlerpři vytváření kontextu korutiny. - Zpracovávat výjimky uvnitř samotné korutiny pomocí try/catch.
- U korutin spuštěných přes
asynclze 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.