Junior — Middle
A execução assíncrona será cancelada se houver um launch dentro dela e ocorrer uma exceção?
sobes.tech IA
Resposta da IA
No Kotlin Coroutines, se dentro de um bloco async uma coroutine é iniciada através de launch, a exceção ocorrida em launch não cancelará automaticamente a execução de async.
A razão é que async e launch criam diferentes coroutines com mecanismos diferentes de tratamento de erros:
asyncretorna umDeferrede os erros internos serão propagados ao chamarawait().launchinicia uma coroutine que não retorna resultado, e as exceções nela são tratadas através de CoroutineExceptionHandler ou levam ao cancelamento da coroutine pai.
Se launch for iniciado dentro de async sem ligação explícita com seu Job, a exceção em launch não cancelará async. Para garantir o cancelamento, deve-se iniciar launch no mesmo CoroutineScope ou usar SupervisorJob, ou tratar os erros explicitamente.
Exemplo:
val deferred = async {
launch {
throw Exception("Erro no launch")
}
// execução de async continuará
}
// Exceção de launch não afetará deferred, até que seja chamado await()