Sobes.tech
Junior — Middle

Kako obraditi izuzetke prilikom pokretanja korutina pomoću try/catch, smeštenog izvan funkcije launch?

sobes.tech АИ

Одговор од АИ

U Kotlinu, izuzeci koji se javljaju unutar korutina ne mogu se uhvatiti običnim try/catch ako su smešteni izvan funkcije launch, jer launch pokreće korutinu asinhrono i odmah vraća objekat Job, a izuzeci se već javljaju u drugom kontekstu.

Da biste obradili izuzetke, morate koristiti rukovaoce unutar korutine ili specijalne mehanizme:

  • Koristite CoroutineExceptionHandler prilikom kreiranja konteksta korutine.
  • Obradite izuzetke unutar same korutine pomoću try/catch.
  • Za korutine pokrenute putem async, možete uhvatiti izuzetak pozivom await().

Primer sa CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Uhvaćen izuzetak: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Greška u korutini")
}

job.join()

Na ovaj način, try/catch van launch neće raditi, potrebno ga je uhvatiti unutar korutine ili koristiti CoroutineExceptionHandler.