Sobes.tech
Junior — Middle

Como lidar com exceções ao iniciar corrotinas usando try/catch, colocado fora da função launch?

sobes.tech IA

Resposta da IA

No Kotlin, as exceções que ocorrem dentro de corrotinas não podem ser capturadas com try/catch comum se estiverem colocadas fora da função launch, porque launch inicia a corrotina de forma assíncrona e retorna imediatamente um objeto Job, e as exceções já ocorrem em outro contexto.

Para tratar as exceções, é necessário usar manipuladores dentro da própria corrotina ou mecanismos especiais:

  • Usar CoroutineExceptionHandler ao criar o contexto da corrotina.
  • Tratar as exceções dentro da própria corrotina com try/catch.
  • Para corrotinas iniciadas com async, é possível capturar a exceção ao chamar await().

Exemplo com CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Exceção capturada: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Erro na corrotina")
}

job.join()

Dessa forma, try/catch fora de launch não funcionará, é preciso capturá-la dentro da corrotina ou usar CoroutineExceptionHandler.