Junior — Middle
¿Se cancelará la ejecución asíncrona si dentro de ella hay un launch y ocurre una excepción?
sobes.tech AI
Respuesta de la IA
En Kotlin Coroutines, si dentro de un bloque async se inicia una coroutine mediante launch, la excepción que ocurra en launch no cancelará automáticamente la ejecución de async.
La razón es que async y launch crean diferentes coroutines con diferentes mecanismos de manejo de errores:
asyncdevuelve unDeferredy los errores dentro de él serán propagados cuando se llame aawait().launchinicia una coroutine que no devuelve resultado, y las excepciones en ella se manejan a través de CoroutineExceptionHandler o conducen a la cancelación de la coroutine padre.
Si launch se inicia dentro de async sin vinculación explícita con su Job, la excepción en launch no cancelará async. Para asegurar la cancelación, se debe iniciar launch en el mismo CoroutineScope o usar SupervisorJob, o manejar los errores explícitamente.
Ejemplo:
val deferred = async {
launch {
throw Exception("Error en launch")
}
// la ejecución de async continuará
}
// La excepción de launch no afectará a deferred, hasta que se llame a await()