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ť
CoroutineExceptionHandlerpri vytváraní kontextu korutiny. - Spracovávať výnimky vo vnútri samotnej korutiny pomocou try/catch.
- Pre korutiny spustené cez
asyncje 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.