Sobes.tech
Junior — Middle

L'exécution asynchrone sera-t-elle annulée si elle contient un launch et qu'une exception se produit ?

sobes.tech IA

Réponse de l'IA

Dans Kotlin Coroutines, si une coroutine est lancée via launch à l'intérieur d'un bloc async, l'exception survenue dans launch n'annulera pas automatiquement l'exécution de async.

La raison est que async et launch créent différentes coroutines avec des mécanismes de gestion des erreurs différents :

  • async retourne un Deferred et les erreurs à l'intérieur seront propagées lors de l'appel à await().
  • launch démarre une coroutine qui ne retourne pas de résultat, et les exceptions y sont gérées via CoroutineExceptionHandler ou entraînent l'annulation de la coroutine parente.

Si launch est lancé à l'intérieur de async sans liaison explicite avec son Job, l'exception dans launch n'annulera pas async. Pour assurer l'annulation, il faut lancer launch dans le même CoroutineScope ou utiliser SupervisorJob, ou gérer les erreurs explicitement.

Exemple :

val deferred = async {
    launch {
        throw Exception("Erreur dans launch")
    }
    // l'exécution de async continuera
}

// L'exception de launch n'affectera pas deferred, tant que await() n'est pas appelé