Sobes.tech
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 async não são lançadas imediatamente, mas são adiadas até à chamada de await(). Se await() 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.