Taming Exception Handling: Mining Anti-Patterns, Understanding Bugs, and Recommending Handlers
Tratamento de Exceções; Engenharia de Software Empírica; Bugs; Anti-
padrões; Análise Estática; Large Language Models.
Mecanismos de tratamento de exceções são projetados para gerenciar eventos anormais que
interrompem o fluxo normal de execução de um programa, ajudando o software a se recuperar
de situações inesperadas. Embora sejam essenciais para robustez, confiabilidade e
manutenibilidade, seu uso inadequado pode introduzir anti-padrões de tratamento de exceções
e bugs de tratamento de exceções, levando a falhas, comportamentos incorretos, diagnósticos
imprecisos, falhas silenciosas e degradação da qualidade do software. Pesquisas existentes
têm se concentrado principalmente em Java e C#, deixando uma lacuna no entendimento
empírico de bugs de tratamento de exceções em Python. Esta tese aborda essa lacuna por
meio de três estudos complementares organizados em torno de uma perspectiva de
detectar–compreender–recomendar: primeiro, desenvolvemos suporte ferramental para
detectar anti-padrões de tratamento de exceções; em seguida, conduzimos uma caracterização
empírica em larga escala de bugs de tratamento de exceções em Python; por fim, avaliamos se
Large Language Models (LLMs) podem apoiar tarefas de recomendação de tratamento de
exceções.
Para apoiar a detecção de práticas inadequadas de tratamento de exceções, projetamos e
avaliamos a Exception Miner, uma ferramenta de análise estática que identifica anti-padrões de
tratamento de exceções em Java, TypeScript e Python. Nossa avaliação em projetos open-
source multi-linguagem mostra que anti-padrões de tratamento de exceções são comuns em
diferentes linguagens. Python e TypeScript apresentam frequências semelhantes, enquanto
Java exibe substancialmente mais ocorrências, com Exception Swallowing e Destructive
Wrapping entre os anti-padrões mais prevalentes. Esses achados reforçam a necessidade de
suporte unificado e multi-linguagem para analisar práticas de tratamento de exceções em
projetos modernos de software.
Para compreender bugs de tratamento de exceções em Python, conduzimos um estudo
empírico em larga escala em 550 projetos open-source. A partir de 18.904 candidatos a
correções de bugs, identificamos 1.649 candidatos a bugs de tratamento de exceções e
validamos manualmente 942 bugs genuínos de tratamento de exceções. Derivamos uma
taxonomia com 12 causas-raiz e 25 padrões de correção. Unhandled Exception é a causa-raiz
mais frequente, representando 50,64% dos bugs analisados. As estratégias de reparo mais
comuns incluem adicionar blocos de tratamento de exceções, alterar tipos de exceção e
introduzir condições de raise. Também realizamos uma análise antes-e-depois, que mostra que
muitos anti-padrões de tratamento de exceções foram preservados a partir da versão
defeituosa, enquanto as correções ainda introduziram um aumento de 196 ocorrências de anti-
padrões de tratamento de exceções.
Para investigar suporte automatizado para recomendações de tratamento de exceções,
avaliamos empiricamente LLMs baseados em prompting em quatro tarefas de tratamento de
exceções em Python: detectar se o tratamento de exceções é necessário, localizar instruções
que devem ser envolvidas por blocos try, recomendar tipos de exceção e gerar tratadores de
exceções. Utilizando 21 projetos Python open-source, 479.345 funções coletadas e 379
snippets curados, avaliamos CodeLlama, Phi-4, GPT-4 Mini, Claude Haiku 4.5 e Gemini 3
Flash sob quatro estratégias de prompting. Os resultados mostram que LLMs são mais eficazes
em tarefas iniciais de raciocínio, alcançando melhores F-scores de 0,752 para detecção da
necessidade de tratamento de exceções e 0,733 para localização de blocos try. Entretanto, a
recomendação de tipos de exceção e a geração de tratadores permanecem substancialmente
mais desafiadoras. Os tratadores gerados frequentemente divergem semanticamente das
implementações escritas por desenvolvedores e introduzem, em média, 104,2% mais violações
de qualidade relacionadas a exceções, particularmente devido à ausência de encadeamento de
exceções e à captura excessivamente genérica de exceções.
De modo geral, esta tese fornece ferramentas, taxonomias, datasets e evidências empíricas
para apoiar a detecção, compreensão e recomendação de mecanismos de tratamento de
exceções. Os achados sugerem que técnicas de análise estática e abordagens baseadas em
LLMs podem auxiliar desenvolvedores na identificação de código propenso a exceções e na
melhoria de práticas de tratamento de exceções. No entanto, código de tratamento de
exceções gerado automaticamente deve ser validado por meio de análise estática, testes e
revisão humana antes de sua adoção.