Pergunta

Para um bloco como este:

try:
    #some stuff
except Exception:
    pass

aumentos pylint aviso 'Catch "Exception"' W0703. Por quê?

Foi útil?

Solução

É considerada boa prática normalmente não pegar o objeto de exceção raiz, mas em vez para pegar mais específicos -. Por exemplo IOException

Considere se uma exceção de memória ocorreu -. Usando simplesmente "passar" não vai deixar o seu programa em um estado bom

Praticamente a única vez que você deve pegar exceção é no nível superior do seu programa, onde você pode (tentar) registrá-lo, exibir um erro, e sai tão graciosamente quanto possível.

Outras dicas

É uma boa prática para pegar apenas uma faixa muito estreita de tipos. 'Exceção' é demasiado geral - você vai acabar pegando não apenas os erros que você previstas para, mas outros erros também, o que pode mascarar erros em seu código que seria mais rápido para diagnosticar se eles não foram apanhados em tudo, ou possivelmente faria ser melhor tratadas por um único manipulador muito alta exceção de nível.

Dito isto, uma vez python2.6, captura de exceção tornou-se muito mais razoável, porque todas as exceções que você não gostaria de não herdar de Exception catch (SystemExit, KeyboardInterrupt). Eles vez herdam de uma BaseException comum em seu lugar. Isso tem sido feito deliberadamente, a fim de fazer a captura de exceção relativamente inofensivo, uma vez que é um idioma tão comum.

Consulte PEP 3110 para detalhes e planos para o futuro.

porque pensa que você está pegando muito. e é certo.

Exceção são levantadas quando algo ... excepcional ocorre. É geralmente uma boa coisa que o termina do programa.

Você pode querer ignorar algumas exceções, mas IMO não há nenhuma boa razão para a captura de uma classe de base assim.

como resposta de Greg, 'exceção' é uma classe base e exceções devem ser derivado dessa classe, ver também exceptions.Exception .

Aqui, um muito útil lista de erros em pydocs

Note também o módulo de rastreamento muito útil que lhe permite descobrir onde a exceção ocorreu. Usando apenas 'exceto: ...' vai mostrar o que de erro você deve melhor uso no seu caso. Por exemplo, tente este código (de alternância comentário), talvez você vai aceitá-lo:

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 

Catching Exception (sem re-raise) tem 2 efeitos colaterais muito ruins: os erros são comidos, assim você perder o rastreamento de pilha, mas também que ctrl-c (ou qualquer que seja a tecla pausa é do seu sistema operacional) também recebe tratado aqui.

O comportamento típico de programas como este é que ou eles não podem ser interrompidos, ou que ctrl-c faz com que o fluxo de controle para saltar para a frente (para o manipulador de exceção), e em seguida continuar. Então, ou o código não pode ser interrompido, ou você precisa martelo sobre ctrl-c para fazê-lo parar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top