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 :
asyncretourne unDeferredet les erreurs à l'intérieur seront propagées lors de l'appel àawait().launchdé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é