Quando você só quer fazer uma tentativa, exceto sem manipular a exceção, como você faz isso no Python?
O seguinte é o caminho certo para fazer isso?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
fonte
fonte
shutil.rmtree(path, ignore_errors=True)
. Isso não se aplica à maioria das funções, no entanto.try: rob() except: run()
Respostas:
ou
A diferença é que o primeiro também vai pegar
KeyboardInterrupt
,SystemExit
e coisas assim, que são derivadas diretamenteexceptions.BaseException
, nãoexceptions.Exception
.Consulte a documentação para obter detalhes:
try
declaraçãofonte
try: shuti.rmtree(...) except: pass
suprimirá de forma grosseira quaisquer erros (mesmo se você cometershutil
um erro de ortografia resultando em aNameError
) - pelo menosexcept OSError:
Geralmente, é considerado uma boa prática capturar apenas os erros nos quais você está interessado. No caso
shutil.rmtree
, provavelmenteOSError
:Se você deseja ignorar silenciosamente esse erro, faça:
Por quê? Digamos que você (de alguma forma) passe acidentalmente a função um número inteiro em vez de uma string, como:
Ele exibirá o erro "TypeError: coagindo para Unicode: precisa de string ou buffer, int encontrado" - você provavelmente não deseja ignorar isso, o que pode ser difícil de depurar.
Se você definitivamente deseja ignorar todos os erros, pegue em
Exception
vez de umaexcept:
declaração simples . Novamente, por que?Não especificar uma exceção captura todas as exceções, incluindo a
SystemExit
exceção que, por exemplo,sys.exit()
usa:Compare isso com o seguinte, que sai corretamente:
Se você deseja escrever um código de comportamento cada vez melhor, a
OSError
exceção pode representar vários erros, mas no exemplo acima, queremos apenas ignorarErrno 2
, para que possamos ser ainda mais específicos:fonte
shutil.rmtree
não é o melhor exemplo, porque você usaria apenasignore_errors=True
para essa função ..Depende do que você quer dizer com "manuseio".
Se você deseja capturá-lo sem executar nenhuma ação, o código que você postou funcionará.
Se você quer dizer que deseja executar uma exceção sem interromper a exceção de subir a pilha, então deseja algo como isto:
fonte
Primeiro cito a resposta de Jack o'Connor neste tópico . O thread referenciado foi fechado, então eu escrevo aqui:
"Existe uma nova maneira de fazer isso no Python 3.4:
Aqui está o commit que o adicionou: http://hg.python.org/cpython/rev/406b47c64480
E aqui está o autor, Raymond Hettinger, falando sobre isso e todos os tipos de gostosuras de Python: https://youtu.be/OSGv2VnC0go?t=43m23s
Minha adição a isso é o equivalente ao Python 2.7:
Então você o usa como no Python 3.4:
fonte
Para completar:
Observe também que você pode capturar a exceção assim:
... e redigite a exceção assim:
... exemplos do tutorial python .
fonte
Existem várias maneiras de fazer isso.
No entanto, a escolha do exemplo tem uma solução simples que não cobre o caso geral.
Específico para o exemplo:
Ao invés de
Faça isso:
Este é um argumento específico para
shutil.rmtree
. Você pode ver a ajuda fazendo o seguinte, e também pode permitir a funcionalidade de erros.Como isso cobre apenas o caso restrito do exemplo, demonstrarei mais detalhadamente como lidar com isso se esses argumentos de palavra-chave não existirem.
Abordagem geral
Como o descrito acima cobre apenas o caso restrito do exemplo, demonstrarei mais detalhadamente como lidar com isso se esses argumentos de palavra-chave não existirem.
Novo no Python 3.4:
Você pode importar o
suppress
gerenciador de contexto:Mas suprima apenas a exceção mais específica:
Você ignorará silenciosamente um
FileNotFoundError
:Dos documentos :
Observe que
suppress
eFileNotFoundError
só estão disponíveis no Python 3.Se você deseja que seu código funcione também no Python 2, consulte a próxima seção:
Python 2 e 3:
Para código compatível com Python 2,
pass
é a maneira correta de ter uma declaração que não é operacional. Mas quando você faz um nuexcept:
, isso é o mesmo que fazerexcept BaseException:
o que incluiGeneratorExit
,KeyboardInterrupt
eSystemExit
, e, em geral, você não quer pegar essas coisas.De fato, você deve ser o mais específico possível em nomear a exceção.
Aqui está parte da hierarquia de exceções do Python (2) e, como você pode ver, se você capturar exceções mais gerais, poderá ocultar problemas que não esperava:
Você provavelmente deseja capturar um OSError aqui, e talvez a exceção com a qual você não se importa seja se não houver diretório.
Podemos obter esse número de erro específico da
errno
biblioteca e re-aumentar se não tivermos isso:Observe que um aumento simples gera a exceção original, que provavelmente é o que você deseja neste caso. Escrito de forma mais concisa, pois não precisamos explicitamente
pass
com código no tratamento de exceções:fonte
Isso ajudará você a imprimir qual é a exceção :( ou seja, tente capturar sem manipular a exceção e imprima a exceção.)
fonte
Para sua informação, a cláusula else pode ser executada após todas as exceções e só será executada se o código na tentativa não causar uma exceção.
fonte
else
para esse contexto. E para adicionar issofinally
, sempre será executado após qualquer (ou nenhuma exceção).Eu precisava ignorar erros em vários comandos e fuckit fez o truque
fonte
No Python, lidamos com exceções semelhantes a outra linguagem, mas a diferença é alguma diferença de sintaxe, por exemplo,
fonte
Eu costumo fazer:
fonte
_ = ""
porpass
.