O Que É uma Exceção? Sinalizando Que Algo Deu Errado
Uma exceção é um sinal de que algo deu errado durante a execução: ela interrompe o fluxo normal e se propaga para cima até que algum código a capture e trate.
Quando o código encontra uma situação pela qual não consegue prosseguir, um arquivo ausente, uma entrada ruim, uma chamada de rede que falhou, ele pode lançar (throw) uma exceção. Isso desenrola a pilha de chamadas, pulando a execução normal, até que um handler a capture. Exceções separam o caminho feliz do tratamento de erros, mas uma exceção não capturada encerra o programa.
Como as exceções fluem
Lançar uma exceção interrompe a execução normal e sobe pela pilha de chamadas procurando um handler correspondente (um try/catch ou equivalente). Se um for encontrado, o controle salta para lá; se nenhum for, a exceção alcança o topo e trava o programa com um erro e um stack trace.
Quando usar exceções
- Condições verdadeiramente excepcionais fora do fluxo normal.
- Erros que um chamador distante, não o imediato, deve tratar.
- Situações em que retornar um valor de erro poluiria o código.
- Falhas que não devem ser silenciosamente ignoradas.
Exceções vs valores de erro
Algumas linguagens favorecem exceções; outras (como Go e Rust) retornam erros como valores para que o tratamento seja explícito. Exceções mantêm o caminho feliz limpo, mas podem esconder onde as falhas ocorrem; valores de erro são explícitos mas mais verbosos. Ambos são estilos válidos.
O stack trace
Uma exceção não capturada imprime um stack trace: a cadeia de chamadas que levou ao erro. É o artefato mais útil para depuração, mostrando exatamente onde e como a falha aconteceu. Ler stack traces bem é uma habilidade central.
Um exemplo rápido
Chamar JSON.parse("not json") lança uma exceção. Envolvê-la em try/catch permite tratar a entrada ruim graciosamente em vez de travar o programa inteiro.
Exceções em CI
Uma exceção não capturada em um teste falha a execução e imprime um stack trace, sua primeira pista da causa. A maioria dessas falhas são bugs determinísticos a corrigir, mas algumas vêm de infraestrutura transitória (uma conexão perdida). A Latchkey repete automaticamente casos transitórios enquanto deixa exceções reais visíveis.
Principais conclusões
- Uma exceção sinaliza um erro, desenrolando a pilha até que um handler a capture.
- Exceções não capturadas travam o programa e imprimem um stack trace para depuração.
- Exceções e valores de erro são dois estilos válidos para lidar com falhas.