Como se devem tratar exceções em blocos try-except do Python?

wind17 IN 📗 Estudante 👁 32 ⚑ Denunciar Programação

Estou escrevendo Python há alguns anos agora e ainda não tenho certeza se devo capturar exceções específicas ou usar uma cláusula except genérica. Meu código atual tem muitos manipuladores de exceção genéricos e estou me perguntando se isso é realmente uma má prática ou se é aceitável para projetos menores.

2 respostas

★ Melhor resposta

O que seu código está realmente fazendo quando essas exceções acontecem - você está registrando elas, tentando novamente, ou apenas passando adiante silenciosamente?

A razão pela qual as pessoas insistem em exceções específicas é que um `except:` ou `except Exception:` sem especificação vai capturar literalmente tudo, incluindo coisas que você não antecipou e provavelmente não deveria estar engolindo. Como se você está tentando abrir um arquivo e captura `FileNotFoundError`, isso é específico e faz sentido. Mas um except vazio também vai capturar coisas como `KeyboardInterrupt` ou `SystemExit`, que você geralmente quer deixar passar. Pior ainda, isso esconde bugs - se seu código tem um typo ou erro de lógica que levanta algo inesperado, você nunca vai ver porque a cláusula except comeu.

Dito isso, para scripts menores ou coisas rápidas, as pessoas ficam pragmáticas com isso. A diferença realmente aparece quando você está debugando ou quando seu código é passado para outra pessoa. Exceções específicas deixam sua intenção clara - esse código sabe como lidar com um arquivo faltando, mas não com um problema de conexão com banco de dados. Se você está escrevendo algo que vai permanecer pequeno, capturar `Exception` (não um `except` vazio) é muito mais seguro do que um handler genérico, e você pelo menos consegue ver o que está sendo capturado. Conforme seus projetos crescerem, você vai querer ficar mais específico mesmo. A prática de ser deliberado sobre o que você captura não é apenas pedantaria - isso te salva de bugs misteriosos depois.

wind17 asker No momento só estou registrando e seguindo em frente. São basicamente operações de I/O de arquivo e chamadas de API em scripts pequenos, então ainda não enfrentei problemas, mas vejo seu ponto sobre bugs escondidos.

Exceções específicas são melhores que genéricas porque você vai pegar bugs que não pretendia deixar passar - tipo um erro de digitação no nome de uma variável que lança `NameError`, que um `except:` nu vai esconder em vez de deixar você consertar. Mesmo em projetos menores, o hábito se paga rápido; você sempre pode agrupar exceções relacionadas tipo `except (ValueError, TypeError):` se quiser manter as coisas enxutas.

A cilada real que galera ignora: `except:` nu também pega coisas como `KeyboardInterrupt` e `SystemExit`, então seu programa pode ignorar um Ctrl+C do usuário e continuar rodando. Use `except Exception:` no mínimo absoluto se precisar de um catch-all, mas sinceramente, dedique 30 segundos pra descobrir o que pode realmente falhar e liste isso.

Sua resposta

Entrarpara responder.