Sé que puedo hacer:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
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 en este momento 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
Entonces, mi esfuerzo por atrapar las dos excepciones distintas no se concreta exactamente.
¿Hay alguna forma de hacer esto?
python
exception
exception-handling
inspectorG4dget
fuente
fuente
Respuestas:
De la documentación de Python :
O, solo para Python 2:
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
.fuente
list
, y resultó en unTypeError
. Parece que los errores deben estar en unatuple
para que la captura funcione como se esperaba.except
línea. Solo está necesariamente entre paréntesis si se crea en laexcept
línea.2 + (x * 2)
,(x * 2)
ciertamente no es una tupla. Los paréntesis son una construcción de agrupación general. La característica definitoria de una tupla es que contiene una coma . Consulte la documentación de Python : "Tenga en cuenta que en realidad es la coma la que hace una tupla, no los paréntesis".Hacer esto:
Los paréntesis son obligatorios debido a una sintaxis anterior que utilizaba las comas para asignar el objeto de error a un nombre. La
as
palabra clave se usa para la asignación. Puede usar cualquier nombre para el objeto de error, prefieroerror
personalmente.Mejores prácticas
Para hacer esto de una manera actual y compatible con Python, debe separar las Excepciones con comas y envolverlas con paréntesis para diferenciar de la sintaxis anterior que asignó la instancia de excepción a un nombre de variable siguiendo el Tipo de excepción que se capturará con un coma.
Aquí hay un ejemplo de uso simple:
Solo especifico estas excepciones para evitar esconder errores, que si encuentro espero el seguimiento completo de la pila.
Esto se documenta aquí: https://docs.python.org/tutorial/errors.html
Puede asignar la excepción a una variable, (
e
es común, pero puede preferir una variable más detallada si tiene un manejo de excepciones prolongado o su IDE solo resalta selecciones más grandes que eso, como lo hace el mío). La instancia tiene un atributo args. Aquí hay un ejemplo:Tenga en cuenta que en Python 3, el
err
objeto queda fuera de alcance cuandoexcept
se concluye el bloque.Obsoleto
Es posible que vea un código que asigna el error con una coma. Este uso, el único formulario disponible en Python 2.5 y versiones anteriores, está en desuso, y si desea que su código sea compatible con Python 3, debe actualizar la sintaxis para usar el nuevo formulario:
Si ve la asignación de nombre de coma en su base de código, y está usando Python 2.5 o superior, cambie a la nueva forma de hacerlo para que su código siga siendo compatible cuando actualice.
El
suppress
administrador de contextoLa respuesta aceptada es realmente 4 líneas de código, mínimo:
El
try
,except
,pass
líneas pueden ser manejados en una sola línea con el gestor de contexto suprimir, disponible en Python 3.4 :Entonces, cuando desee
pass
ciertas excepciones, usesuppress
.fuente
suppress
, mucho más legible que acaba de hacerpass
enexcept
De la documentación de Python -> 8.3 Excepciones de manejo :
fuente
Si utiliza con frecuencia una gran cantidad de excepciones, puede predefinir una tupla, por lo que no tiene que volver a escribirlas muchas veces.
NOTAS
Si también necesita capturar otras excepciones que las de la tupla predefinida, deberá definir otro excepto el bloque.
Si no puede tolerar una variable global, defínalo en main () y páselo donde sea necesario ...
fuente
Una de las formas de hacerlo es ...
y otra forma es crear un método que realice la tarea ejecutada por el
except
bloque y llamarlo a través de todo elexcept
bloque que escriba.Sé que el segundo no es la mejor manera de hacer esto, pero solo estoy mostrando varias formas de hacer esto.
fuente
except
cláusulas es normal cuando desea manejar las excepciones de manera diferente.