Eu sei que posso fazer:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Eu também posso fazer isso:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreTooShortException:
# stand on a ladder
Mas se eu quiser fazer a mesma coisa em duas exceções diferentes, o melhor que posso pensar agora é fazer o seguinte:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreBeingMeanException:
# say please
Existe alguma maneira de fazer algo assim (desde que a ação a ser executada nas duas exceções seja say please
):
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
Agora isso realmente não funcionará, pois corresponde à sintaxe de:
try:
# do something that may fail
except Exception, e:
# say please
Portanto, meu esforço para capturar as duas exceções distintas não ocorre exatamente.
Existe uma maneira de fazer isso?
python
exception
exception-handling
inspectorG4dget
fonte
fonte
Respostas:
Da documentação do Python :
Ou, apenas para Python 2:
A separação da exceção da variável por vírgula ainda funcionará no Python 2.6 e 2.7, mas agora está obsoleta e não funciona no Python 3; agora você deveria estar usando
as
.fonte
list
, e resultou em umTypeError
. Parece que os erros devem estar em umtuple
para começar a funcionar como esperado.except
linha. Só é necessariamente entre parênteses se criado naexcept
linha.2 + (x * 2)
,(x * 2)
certamente não é uma tupla. Parênteses são uma construção de agrupamento geral. A característica definidora de uma tupla é que ela contém uma vírgula - consulte a documentação do Python : "Observe que na verdade é a vírgula que faz uma tupla, não os parênteses".Faça isso:
Os parênteses são necessários devido à sintaxe mais antiga que usou as vírgulas para atribuir o objeto de erro a um nome. A
as
palavra-chave é usada para a atribuição. Você pode usar qualquer nome para o objeto de erro, eu prefiroerror
pessoalmente.Melhor prática
Para fazer isso de uma maneira atualmente compatível com o Python e com o encaminhamento, você precisa separar as Exceções por vírgulas e colocá-las entre parênteses para diferenciar da sintaxe anterior que atribuiu a instância de exceção a um nome de variável, seguindo o tipo de Exceção a ser capturado com um vírgula.
Aqui está um exemplo de uso simples:
Estou especificando apenas essas exceções para evitar ocultar erros, dos quais, se eu encontrar, espero que o rastreamento completo da pilha seja feito.
Isso está documentado aqui: https://docs.python.org/tutorial/errors.html
É possível atribuir a exceção a uma variável (
e
é comum, mas você pode preferir uma variável mais detalhada se tiver um tratamento longo de exceções ou se o IDE destacar apenas seleções maiores que essa, como a minha.) A instância possui um atributo args. Aqui está um exemplo:Observe que no Python 3, o
err
objeto fica fora de escopo quando oexcept
bloco é concluído.Descontinuada
Você pode ver o código que atribui o erro com uma vírgula. Esse uso, o único formulário disponível no Python 2.5 e versões anteriores, foi descontinuado e, se você deseja que seu código seja compatível com o encaminhamento no Python 3, atualize a sintaxe para usar o novo formulário:
Se você vir a atribuição de nome de vírgula na sua base de código e estiver usando o Python 2.5 ou superior, mude para a nova maneira de fazer isso, para que seu código permaneça compatível quando você atualizar.
O
suppress
gerenciador de contextoA resposta aceita é realmente 4 linhas de código, no mínimo:
A
try
,except
,pass
as linhas podem ser tratados de uma única linha com o gerente contexto suprimir, disponível em Python 3.4 :Então, quando quiser,
pass
em determinadas exceções, usesuppress
.fonte
suppress
, muito mais legível do que apenas fazerpass
emexcept
Da documentação do Python -> 8.3 Manipulando exceções :
fonte
Se você usa frequentemente um grande número de exceções, pode predefinir uma tupla, para não precisar digitá-las novamente muitas vezes.
NOTAS:
Se você também precisar capturar outras exceções que não sejam as da tupla predefinida, precisará definir outro bloco, exceto.
Se você simplesmente não pode tolerar uma variável global, defina-a em main () e passe-a onde for necessário ...
fonte
Uma das maneiras de fazer isso é ..
e outra maneira é criar o método que executa a tarefa executada pelo
except
bloco e chamá-lo através de todo oexcept
bloco que você escreve.Eu sei que o segundo não é a melhor maneira de fazer isso, mas estou apenas mostrando várias maneiras de fazer isso.
fonte
except
cláusulas é normal quando você deseja manipular as exceções de maneira diferente.