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.
Arraste para o lado para ver o diagrama inteiro.
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ãoSocketTimeoutException. - 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
suspend fun carregarPerfil(id: String): Perfil? = try {
api.perfil(id)
} catch (e: Exception) {
null // sem rede? 404? bug de parsing? cancelamento? ninguém sabe
} 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
- Falhe cedo, com mensagem útil.
- Erros esperados viram tipos (sealed/Result).
- Traduza exceções técnicas na fronteira.
- Nunca engula exceções; nunca engula cancelamento.