Sobes.tech
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:

  • async retorna um Deferred e os erros internos serão propagados ao chamar await().
  • launch inicia 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()