Junior — Middle
Quais são as diferenças no tratamento de erros entre o uso de launch e async/await em corrotinas?
sobes.tech IA
Resposta da IA
No Kotlin, launch e async diferem na gestão de erros:
-
launch: inicia uma coroutine que não devolve resultado. Se ocorrer uma exceção dentro de
launch, ela é passada para o CoroutineExceptionHandler ou propagada no contexto pai, o que pode levar ao cancelamento da coroutine pai. -
async: inicia uma coroutine que devolve um Deferred — um resultado diferido. As exceções dentro de
asyncnão são lançadas imediatamente, mas são adiadas até à chamada deawait(). Seawait()não for chamado, o erro pode passar despercebido.
Exemplo:
val job = launch {
throw Exception("Erro no launch")
}
val deferred = async {
throw Exception("Erro no async")
}
runBlocking {
job.join() // a exceção será tratada aqui
try {
deferred.await() // a exceção é lançada aqui
} catch (e: Exception) {
println("Erro capturado: ${e.message}")
}
}
Assim, launch sinaliza imediatamente um erro, enquanto async só o faz ao tentar obter o resultado.