Saltar al contenido

Diferencia entre except: y except Exception como e: en Python

Solución:

En el segundo se puede acceder a los atributos del objeto de excepción:

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

Pero no atrapa BaseException o las excepciones que salen del sistema SystemExit, KeyboardInterrupt y GeneratorExit:

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

Lo que hace un desnudo excepto:

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

Consulte la sección Excepciones integradas de los documentos y la sección Errores y excepciones del tutorial para obtener más información.

except:

acepta todos excepciones, mientras que

except Exception as e:

solo acepta excepciones de que eres quiso decir atrapar.

Aquí tienes un ejemplo de uno que no debes atrapar:

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

El primero silenció al KeyboardInterrupt!

He aquí una lista rápida:

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False


issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False


issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

Si quieres atrapar alguno de esos, es mejor hacerlo

except BaseException:

para señalar que sabe lo que está haciendo.


Todos las excepciones provienen de BaseException, y aquellos que debes atrapar día a día (aquellos que serán lanzados por el programador) heredan también de Exception.

Existen diferencias con algunas excepciones, por ejemplo, KeyboardInterrupt.

Leyendo PEP8:

Una simple cláusula except: capturará las excepciones SystemSalir y KeyboardInterrupt, dificultando la interrupción de un programa con Control-C, y puede ocultar otros problemas. Si desea capturar todas las excepciones que señalan errores de programa, utilice except Exception: (bare except es equivalente a except BaseException :).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *