Sobes.tech
Junior — Middle

Verrà annuita l'esecuzione asincrona se contiene un launch e si verifica un'eccezione?

sobes.tech AI

Risposta dell'AI

In Kotlin Coroutines, se all'interno di un blocco async si avvia una coroutine tramite launch, l'eccezione verificatasi in launch non cancellerà automaticamente l'esecuzione di async.

Il motivo è che async e launch creano coroutine diverse con meccanismi di gestione degli errori differenti:

  • async restituisce un Deferred e gli errori al suo interno saranno propagati al momento della chiamata di await().
  • launch avvia una coroutine che non restituisce risultato, e le eccezioni in essa vengono gestite tramite CoroutineExceptionHandler o portano alla cancellazione della coroutine genitore.

Se launch viene avviato all'interno di async senza un collegamento esplicito con il suo Job, l'eccezione in launch non cancellerà async. Per garantire la cancellazione, bisogna avviare launch nello stesso CoroutineScope o usare SupervisorJob, o gestire gli errori in modo esplicito.

Esempio:

val deferred = async {
    launch {
        throw Exception("Errore in launch")
    }
    // l'esecuzione di async continuerà
}

// L'eccezione di launch non influenzerà deferred, finché non si chiama await()