Sobes.tech
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}")
    }
}