Como capturar várias exceções em uma linha (exceto o bloco)
Faça isso:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
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 prefiro error
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Observe que no Python 3, o err
objeto fica fora de escopo quando o except
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
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 contexto
A resposta aceita é realmente 4 linhas de código, no mínimo:
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
A try
, except
, pass
as linhas podem ser tratados de uma única linha com o gerente contexto suprimir, disponível em Python 3.4 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
Então, quando quiser, pass
em determinadas exceções, use suppress
.