Sobes.tech
Junior — Middle

Come gestire le eccezioni durante l'avvio delle coroutine usando try/catch, posizionato al di fuori della funzione launch?

sobes.tech AI

Risposta dell'AI

In Kotlin, le eccezioni che si verificano all'interno delle coroutine non possono essere catturate con un try/catch normale se si trovano fuori dalla funzione launch, perché launch avvia la coroutine in modo asincrono e restituisce immediatamente un oggetto Job, e le eccezioni si verificano già in un altro contesto.

Per gestire le eccezioni, bisogna usare gestori all'interno della coroutine o meccanismi speciali:

  • Usare CoroutineExceptionHandler durante la creazione del contesto della coroutine.
  • Gestire le eccezioni all'interno della stessa coroutine con try/catch.
  • Per le coroutine avviate con async, è possibile catturare l'eccezione chiamando await().

Esempio con CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Eccezione catturata: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Errore nella coroutine")
}

job.join()

In questo modo, try/catch fuori da launch non funzionerà, bisogna catturarlo all'interno della coroutine o usare CoroutineExceptionHandler.