Pregunta Captura múltiples excepciones en una línea (excepto el bloque)


Sé que puedo hacer:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Yo también puedo hacer esto:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

Pero si quiero hacer lo mismo dentro de dos excepciones diferentes, lo mejor que puedo pensar ahora es hacer esto:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

¿Hay alguna manera de que pueda hacer algo como esto (ya que la acción a tomar en ambas excepciones es say please)

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

Ahora esto realmente no funcionará, ya que coincide con la sintaxis de:

try:
    # do something that may fail
except Exception, e:
    # say please

Por lo tanto, mi esfuerzo por atrapar las dos excepciones distintas no llega exactamente.

¿Hay alguna forma de hacer esto?


1957
2018-06-24 15:55


origen


Respuestas:


De Documentación de Python:

Una cláusula except puede nombrar múltiples excepciones como una tupla entre paréntesis, por ejemplo

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

O, solo para Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Separar la excepción de la variable con una coma seguirá funcionando en Python 2.6 y 2.7, pero ahora está en desuso y no funciona en Python 3; ahora deberías estar usando as.


2698
2018-06-24 15:56



¿Cómo atrapo múltiples excepciones en una línea (excepto el bloque)?

Hacer esto:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

Los paréntesis son necesarios debido a la sintaxis anterior que usaba las comas para asignar el objeto de error a un nombre. los as la palabra clave se usa para la tarea. Puedes usar cualquier nombre para el objeto de error, yo prefiero error personalmente.

Mejores prácticas

Para hacer esto de una manera actual y compatible con Python, debe separar las excepciones con comas y envolverlas entre paréntesis para diferenciarlas de la sintaxis anterior que asignó la instancia de excepción a un nombre de variable siguiendo el tipo de excepción para ser capturado con un coma.

Aquí hay un ejemplo de uso simple:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

Estoy especificando solo estas excepciones para evitar la ocultación de errores, que si encuentro, espero que el seguimiento completo de la pila.

Esto está documentado aquí: https://docs.python.org/tutorial/errors.html

Puede asignar la excepción a una variable, (e es común, pero es posible que prefiera una variable más detallada si tiene un manejo de excepciones largo o su IDE solo resalta selecciones más grandes que esa, como lo hace la mía.) La instancia tiene un atributo args. Aquí hay un ejemplo:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

Tenga en cuenta que en Python 3, el err objeto cae fuera del alcance cuando el except el bloque está concluido

Obsoleto

Puede ver el código que asigna el error con una coma. Este uso, el único disponible en Python 2.5 y versiones anteriores, está en desuso, y si desea que su código sea compatible con versiones anteriores en Python 3, debe actualizar la sintaxis para usar el nuevo formulario:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

Si ve la asignación de nombre de coma en su base de código, y está utilizando Python 2.5 o superior, cambie a la nueva forma de hacerlo para que su código siga siendo compatible cuando actualice.

los suppress administrador de contexto

La respuesta aceptada es realmente 4 líneas de código, mínimo:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

los try, except, pass las líneas se pueden manejar en una sola línea con el suprimir el administrador de contexto, disponible en Python 3.4:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Entonces cuando quieras pass en ciertas excepciones, use suppress.


184
2018-06-21 04:20



Para python 2.5 y versiones anteriores, la sintaxis correcta es:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Dónde e es la instancia de la Excepción.


49
2018-05-13 12:37



De Documentación de Python -> 8.3 Manejo de excepciones:

UN try declaración puede tener más de una cláusula except, para especificar   controladores para diferentes excepciones. Como máximo, un controlador será   ejecutado. Los manipuladores solo manejan excepciones que ocurren en   correspondiente cláusula try, no en otros controladores del mismo intento   declaración. Una cláusula except puede nombrar múltiples excepciones como   tupla entre paréntesis, por ejemplo:

except (RuntimeError, TypeError, NameError):
    pass

Tenga en cuenta que los paréntesis alrededor de esta tupla son obligatorios, porque   excepto ValueError, e: fue la sintaxis utilizada para lo que normalmente es   Escrito como except ValueError as e: en Python moderno (descrito   abajo). La sintaxis anterior aún se admite por compatibilidad con versiones anteriores.   Esto significa except RuntimeError, TypeError no es equivalente a    except (RuntimeError, TypeError): sino except RuntimeError as TypeError: que no es lo que quieres


37
2017-10-30 10:01



Si utiliza con frecuencia una gran cantidad de excepciones, puede predefinir una tupla, por lo que no tiene que volver a escribir muchas veces.

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

NOTAS: 

  1. Si usted, también, necesita atrapar otras excepciones que aquellas en el tupla predefinida, tendrá que definir otro bloque excepto.

  2. Si simplemente no puede tolerar una variable global, defínala en main () y pasarlo donde sea necesario ...


15
2017-09-18 01:36



Una de las formas de hacerlo es ...

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

y otra forma es crear el método que realiza la tarea ejecutada por except bloquear y llamar a través de todos los except bloque que escribes ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

Sé que el segundo no es la mejor manera de hacerlo, pero solo estoy mostrando varias maneras de hacerlo.


5
2017-08-17 11:56



La documentación de Python 2.7 establece que:

Una instrucción try puede tener más de una cláusula except, para especificar   controladores para diferentes excepciones. Como máximo, un controlador será   ejecutado. Los manipuladores solo manejan excepciones que ocurren en   correspondiente cláusula try, no en otros controladores del mismo intento   declaración. Una cláusula except puede nombrar múltiples excepciones como   tupla entre paréntesis, por ejemplo:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Nota   que los paréntesis alrededor de esta tupla son obligatorios, porque excepto   ValueError, e: fue la sintaxis utilizada para lo que normalmente se escribe como   excepto ValueError como e: en Python moderno (descrito a continuación). El viejo   la sintaxis aún se admite por compatibilidad con versiones anteriores. Esto significa   excepto RuntimeError, TypeError no es equivalente a excepto   (RuntimeError, TypeError): pero para excluir RuntimeError como TypeError:   que no es lo que quieres


3
2017-12-05 14:05