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 :).