Sobes.tech
Middle — Middle+

Como garantir a separação de erros entre as coroutines filhas e a sua coroutine pai?

sobes.tech IA

Resposta da IA

No Kotlin Coroutines, para separar os erros entre as coroutines filhas e a coroutine pai, utiliza-se o conceito de hierarquia de coroutines e o tratamento de exceções através de CoroutineExceptionHandler e SupervisorJob.

Por padrão, se uma das coroutines filhas lança uma exceção, ela cancela toda a hierarquia, incluindo a coroutine pai e outras filhas.

Para separar os erros e evitar a cancelamento do pai em caso de erros nas filhas, usa-se SupervisorJob ou supervisorScope. Nesse caso, os erros das coroutines filhas não cancelam o pai nem outras filhas.

Exemplo:

val supervisor = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + supervisor)

scope.launch {
    val child1 = launch {
        // Esta coroutine pode falhar
        throw RuntimeException("Erro em child1")
    }
    val child2 = launch {
        // Esta coroutine continuará a executar
        delay(1000)
        println("child2 terminou com sucesso")
    }
}

Aqui, o erro em child1 não causará o cancelamento de child2 nem da coroutine pai.

Para tratar erros, pode-se usar CoroutineExceptionHandler ou try-catch dentro das coroutines.

Dessa forma, a separação de erros é alcançada com SupervisorJob e uma gestão adequada de exceções nas coroutines.