Middle
Quais são as diferenças entre launch e async no contexto do tratamento de erros?
sobes.tech IA
Resposta da IA
No launch, os erros propagam-se diretamente para o contexto pai do coroutine, o que leva à falha da aplicação se não forem tratados. No async, os erros são adiados e só ocorrem quando se chama .await().
Por exemplo:
fun main() = runBlocking {
// launch: erro leva à falha do scope
val job = launch {
throw IllegalStateException("Erro no launch")
}
job.join() // Aguarda a conclusão do job, em caso de erro, o job será cancelado
// async: erro é adiado até ao await
val deferred = async {
throw IllegalStateException("Erro no async")
"Resultado" // Este código não será executado
}
try {
deferred.await() // Aqui será lançado o erro adiado
} catch (e: IllegalStateException) {
println("Erro capturado: ${e.message}")
}
}