Pular para o conteúdo

Boas práticas e padrões · Clean Code · 5 min de leitura

Tratamento de erros

Falhe cedo e com contexto, trate o erro na camada que sabe o que fazer com ele e nunca engula exceções.

API / banco → Repository1Repository → Caso de uso2Caso de uso → ViewModel3ViewModel → Tela4Repository → Log / CrashlyticsAPI / banco — IOExceptionAPI / bancoIOExceptionRepository — traduz o erroRepositorytraduz o erroCaso de uso — Result<T>Caso de usoResult<T>ViewModel — decideViewModeldecideTela — "Sem conexão. Tentar?"Tela"Sem conexão. Tentar?"Log / Crashlytics — com contextoLog / Crashlyticscom contexto

Arraste para o lado para ver o diagrama inteiro.

Cada camada traduz o erro para a sua linguagem; quem decide a mensagem é a camada de apresentação.

Princípios

  • Falhe cedo: valide entradas na fronteira (require, check).
  • Não engula exceções: catch (e: Exception) {} esconde bugs por meses.
  • Traduza na fronteira: o domínio fala SemConexao, não SocketTimeoutException.
  • Erros esperados são dados: "senha errada" não é exceção — modele com sealed/Result.
  • Contexto no log: o que tentava fazer, com quais IDs (sem dados pessoais).

Corrotinas: cuidado

Em Kotlin, CancellationException não deve ser capturada e descartada — ela é o mecanismo de cancelamento. Use runCatching com atenção ou relance o cancelamento.

No código: antes e depois

✗ AntesKotlin
suspend fun carregarPerfil(id: String): Perfil? = try {
  api.perfil(id)
} catch (e: Exception) {
  null // sem rede? 404? bug de parsing? cancelamento? ninguém sabe
}
✓ DepoisKotlin
sealed interface ErroPerfil {
  data object SemConexao : ErroPerfil
  data object NaoEncontrado : ErroPerfil
}

suspend fun carregarPerfil(id: String): Result<Perfil> = try {
  Result.success(api.perfil(id))
} catch (e: CancellationException) {
  throw e // cancelamento segue o fluxo normal
} catch (e: IOException) {
  Result.failure(FalhaPerfil(ErroPerfil.SemConexao, e))
} catch (e: HttpException) {
  if (e.code() == 404) Result.failure(FalhaPerfil(ErroPerfil.NaoEncontrado, e)) else throw e
}

Cada falha esperada tem nome; a tela pode mostrar "Sem conexão" ou "Perfil não existe", e bugs de verdade continuam aparecendo.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →