Business Exception ou Application Exception? A diferença importa
Como separar erros de negócio de falhas técnicas melhora retries, reprocessamento, métricas e sustentação de automações.
Uma automação tenta processar uma solicitação, mas um campo obrigatório está vazio.
Erro.
Em outra execução, o sistema externo está indisponível.
Erro também.
Tecnicamente, os dois cenários impediram o processamento.
Mas eles não representam o mesmo tipo de problema.
Essa distinção parece pequena até começarmos a trabalhar com retry, filas, reprocessamento e monitoramento.
É aí que separar Business Exception de Application Exception começa a fazer bastante diferença.
O que é uma Business Exception?
Uma Business Exception acontece quando a automação está tecnicamente funcionando, mas não consegue concluir determinada transação por causa de uma regra ou condição do próprio processo.
Alguns exemplos:
- dado obrigatório ausente;
- cadastro não encontrado;
- solicitação em situação incompatível;
- valor fora das regras permitidas;
- documento inválido para aquele processo;
- registro já encerrado;
- regra de negócio não atendida.
Observe que, nesses cenários, não existe necessariamente uma falha no robô.
A aplicação pode estar disponível.
A autenticação pode ter funcionado.
A consulta pode ter retornado corretamente.
O problema está na condição daquela transação.
Exemplo simples
Imagine uma automação responsável por processar solicitações.
Uma regra diz:
A solicitação só pode continuar se o cadastro estiver ativo.
A automação consulta o cadastro e recebe:
Status: INATIVO
O sistema respondeu.
A integração funcionou.
O dado foi lido corretamente.
Mas a regra impede o processamento.
Esse é um bom exemplo de Business Exception.
Tentar novamente daqui a dez segundos provavelmente produzirá o mesmo resultado.
E o que é uma Application Exception?
Application Exception representa uma falha técnica que impede a automação de executar corretamente.
Exemplos:
- aplicação indisponível;
- timeout;
- erro de rede;
- falha de autenticação;
- elemento de interface não encontrado;
- arquivo bloqueado;
- resposta HTTP inesperada;
- erro interno não previsto;
- falha ao acessar banco ou serviço externo.
Nesse caso, existe a possibilidade de que uma nova tentativa funcione.
Por exemplo:
Tentativa 1 → Timeout
Tentativa 2 → Sucesso
Essa característica é uma das razões pelas quais a classificação importa.
A pergunta que ajuda a decidir
Uma forma simples de raciocinar é perguntar:
A transação falhou porque os dados ou regras não permitem continuar, ou porque alguma parte técnica necessária para o processo não funcionou?
Se a condição pertence ao negócio, provavelmente estamos diante de uma Business Exception.
Se existe uma falha técnica de execução, provavelmente é uma Application Exception.
Não é uma regra perfeita.
Existem situações ambíguas.
Mas já ajuda bastante.
O impacto no retry
Aqui aparece uma diferença prática enorme.
Suponha que uma solicitação não possua um dado obrigatório.
Tentar novamente:
Tentativa 1 → dado ausente
Tentativa 2 → dado ausente
Tentativa 3 → dado ausente
não resolve nada.
Estamos apenas gastando tempo.
Agora imagine um serviço temporariamente indisponível:
Tentativa 1 → HTTP 503
Tentativa 2 → HTTP 503
Tentativa 3 → HTTP 200
Nesse segundo cenário, retry pode fazer sentido.
Por isso, tratar qualquer erro como falha técnica leva facilmente a retries desnecessários.
O impacto no reprocessamento
A classificação também muda a forma de reprocessar.
Uma Business Exception normalmente exige alguma mudança na condição da transação.
Pode ser necessário:
- corrigir um cadastro;
- completar uma informação;
- alterar um status;
- resolver uma pendência;
- revisar uma regra.
Somente depois disso faz sentido tentar novamente.
Já uma Application Exception pode ter sido causada por uma indisponibilidade temporária.
Nesse caso, o mesmo item pode funcionar em uma nova execução sem alteração dos dados.
O impacto nos indicadores
Imagine um processo com 1.000 transações.
Resultado:
930 sucessos
50 Business Exceptions
20 Application Exceptions
Isso diz muito mais do que:
930 sucessos
70 erros
No primeiro caso, sabemos que 5% das transações não atenderam às condições de negócio e 2% encontraram falhas técnicas.
As ações são diferentes.
Business Exceptions podem indicar problemas nos dados de entrada ou regras do processo.
Application Exceptions podem indicar instabilidade de sistema, integração ou automação.
Misturar tudo esconde informação útil.
No REFramework
No contexto do UiPath REFramework, essa separação aparece de forma bastante explícita.
A ideia geral é que cada transação termine em um dos estados:
- sucesso;
- Business Exception;
- System/Application Exception.
Uma Business Exception pode ser lançada quando a lógica identifica uma condição esperada que impede a continuidade.
Por exemplo:
Cadastro do cliente está inativo.
Já uma falha inesperada de aplicação segue o tratamento técnico.
O framework então consegue aplicar comportamentos diferentes para cada cenário.
Essa é uma das razões pelas quais aprender apenas onde colocar um Try Catch não é suficiente.
Precisamos entender o significado da exceção.
Nem toda validação precisa lançar exceção
Existe uma nuance importante.
Nem toda condição negativa precisa necessariamente virar uma exception.
Às vezes, ela faz parte do fluxo esperado.
Por exemplo:
Existe arquivo para processar?
Não → finalizar execução sem erro.
Isso não precisa ser uma Business Exception.
Não existe uma transação inválida.
Simplesmente não existe trabalho.
A exceção deveria representar uma condição que impede o processamento de algo que deveria estar sendo tratado.
Usar exception para controlar qualquer decisão normal de fluxo também deixa o código mais difícil de entender.
Evite transformar erro técnico em erro de negócio
Outro problema comum acontece quando capturamos qualquer exceção e relançamos como Business Exception.
Algo como:
Try
Consultar sistema
Catch
Lançar Business Exception
Isso destrói a informação original.
Se o sistema estava indisponível, agora parece que o problema era da transação.
Consequências:
- retry pode deixar de acontecer;
- métricas ficam incorretas;
- investigação segue pelo caminho errado;
- o item pode exigir intervenção manual sem necessidade.
A classificação precisa refletir a causa real.
Também existe o problema inverso
Uma condição de negócio pode acabar sendo tratada como Application Exception.
Por exemplo:
if cadastro_inativo:
throw Exception("Cadastro inválido")
Se o framework interpretar isso como falha técnica, pode tentar novamente várias vezes.
O resultado será o mesmo.
Nesses casos, usar explicitamente uma Business Exception deixa a intenção clara.
Mensagens precisam explicar o motivo
Uma boa classificação ainda precisa de uma boa mensagem.
Isto:
Business Exception.
é pouco útil.
Prefira algo que explique a condição:
BusinessException:
Transação 12345 não processada porque o cadastro está inativo.
Para falhas técnicas:
ApplicationException:
Timeout ao consultar serviço de cadastro após 3 tentativas.
Com logs estruturados, podemos separar ainda mais os campos.
O objetivo é permitir que outra pessoa entenda o problema sem precisar adivinhar.
Como eu classificaria alguns cenários
Campo obrigatório vazio
Se o campo deveria vir preenchido pela origem e a ausência impede aquela transação:
Business Exception.
API retorna 503
O serviço está temporariamente indisponível:
Application Exception.
API retorna 404
Depende.
Se 404 significa legitimamente que o cadastro não existe e isso é uma condição de negócio:
Business Exception.
Se a URL do endpoint está errada:
Application Exception.
O mesmo código HTTP pode ter significados diferentes dependendo do contrato.
Usuário não encontrado
Se a busca funcionou e o usuário realmente não existe:
Business Exception.
Elemento da tela não encontrado
Se aquele elemento deveria existir e a interface mudou ou não carregou:
Application Exception.
Nenhum item disponível para processar
Normalmente:
nenhuma exception.
É apenas ausência de trabalho.
A classificação depende do processo
Não existe uma tabela universal capaz de definir todos os erros.
A mesma situação pode ter significado diferente em processos distintos.
O importante é entender:
- o que era esperado?
- a falha pertence aos dados ou regras?
- existe um problema técnico?
- uma nova tentativa pode resolver?
- alguém precisa corrigir a transação?
- a automação consegue continuar?
Essas perguntas são mais úteis do que decorar definições.
Conclusão
Business Exception e Application Exception não são apenas nomes diferentes para erros.
Elas representam causas diferentes.
E causas diferentes deveriam produzir comportamentos diferentes.
A classificação influencia:
- retry;
- reprocessamento;
- monitoramento;
- métricas;
- tratamento de filas;
- sustentação.
Quanto mais crítico e transacional o processo, mais importante essa diferença se torna.
Uma automação madura não deveria apenas saber que falhou.
Ela deveria saber por que falhou.