O argumento principal do livro é que a versão de exceção do código é melhor porque ele detectará qualquer coisa que você possa ter ignorado se você tentou escrever sua própria verificação de erros.
Acho que essa afirmação é verdadeira apenas em circunstâncias muito específicas - onde você não se importa se a saída está correta.
Não há dúvida de que as exceções aumento são uma prática segura e saudável. Você deve fazer isso sempre que sentir que há algo no estado atual do programa com o qual você (como desenvolvedor) não pode ou não quer lidar.
Seu exemplo, no entanto, é sobre exceções pegar . Se você pegar uma exceção, não está se protegendo de situações que talvez tenha ignorado. Você está fazendo exatamente o oposto: assume que não ignorou nenhum cenário que possa ter causado esse tipo de exceção e, portanto, está confiante de que está tudo certo capturá-lo (e, assim, impedir que o programa saia, como qualquer exceção não detectada).
Usando a abordagem de exceção, se você vir ValueError
exception, pula uma linha. Usando a abordagem tradicional sem exceção, você conta o número de valores retornados de split
e, se for menor que 2, pula uma linha. Se você se sentir mais seguro com a abordagem de exceção, já que você pode ter esquecido algumas outras situações de "erro" em sua verificação de erro tradicional, e except ValueError
as pegaria para você?
Isso depende da natureza do seu programa.
Se você estiver escrevendo, por exemplo, um navegador da Web ou um player de vídeo, um problema com as entradas não deverá causar falha em uma exceção não identificada. É muito melhor produzir algo remotamente sensato (mesmo que, estritamente falando, incorreto) do que sair.
Se você estiver escrevendo um aplicativo em que questões corretas sejam importantes (como software comercial ou de engenharia), essa seria uma abordagem terrível. Se você esqueceu de algum cenário que aumenta ValueError
, a pior coisa que você pode fazer é silenciosamente ignorar esse cenário desconhecido e simplesmente ignorar a linha. É assim que bugs muito sutis e caros acabam no software.
Você pode pensar que a única maneira de ver ValueError
neste código é se split
retornou apenas um valor (em vez de dois). Mas e se sua instrução print
mais tarde começar a usar uma expressão que aumente ValueError
sob algumas condições? Isso fará com que você pule algumas linhas não porque elas perdem :
, mas porque print
falha nelas. Este é um exemplo de um bug sutil que eu estava me referindo anteriormente - você não notaria nada, apenas perderia algumas linhas.
Minha recomendação é evitar pegar (mas não aumentar!) exceções no código em que produzir saída incorreta é pior do que sair. A única vez que eu pegaria uma exceção em tal código é quando eu tenho uma expressão verdadeiramente trivial, então eu posso facilmente raciocinar o que pode causar cada um dos tipos de exceção possíveis.
Quanto ao impacto no desempenho do uso de exceções, ele é trivial (em Python), a menos que exceções sejam encontradas com frequência.
Se você usar exceções para lidar com condições de ocorrência rotineira, poderá, em alguns casos, pagar um enorme custo de desempenho. Por exemplo, suponha que você execute remotamente algum comando. Você pode verificar se o texto do seu comando passa pelo menos a validação mínima (por exemplo, sintaxe). Ou você poderia esperar por uma exceção a ser levantada (o que acontece somente depois que o servidor remoto analisa seu comando e encontra um problema com ele). Obviamente, o primeiro é de magnitude mais rápida. Outro exemplo simples: você pode verificar se um número é zero ~ 10 vezes mais rápido do que tentar executar a divisão e, em seguida, capturar a exceção ZeroDivisionError.
Essas considerações só importam se você envia frequentemente cadeias de comandos malformadas para servidores remotos ou recebe argumentos de valor zero que você usa para divisão.
Nota: Suponho que você usaria except ValueError
em vez de apenas except
; como outros apontaram, e como o próprio livro diz em poucas páginas, você nunca deve usar except
nua.
Outra observação: a abordagem adequada sem exceção é contar o número de valores retornados por split
, em vez de pesquisar :
. O último é muito lento, pois repete o trabalho feito por split
e pode quase dobrar o tempo de execução.