¿Hay alguna forma de que ipython muestre la excepción que fue atrapada, en lugar de mostrar en qué parte del código fue capturado?
Usted podría utilizar sys.excepthook
:
import sys
def exc_hook(type, value, traceback):
print type
sys.excepthook = exc_hook
Desde el sys
module documentation:
sys.excepthook(type, value, traceback)
Esta función imprime un rastreo y la excepción que se da a sys.stderr.
Cuando se produce una excepción y no se detecta, el intérprete llama a sys.excepthook con tres argumentos, la clase de excepción, la excepción instancia y un objeto de rastreo. En una sesión interactiva, esto ocurre justo antes de que se devuelva el control al aviso; en un programa Python esto ocurre justo antes de que el programa salga. El manejo de tales excepciones de nivel superior se puede personalizar asignando otra función de tres argumentos a sys.excepthook
.
sys.__displayhook__
sys.__excepthook__
Estos objetos contienen los valores originales de displayhook y excepthook al inicio del programa. Se guardan para que displayhook y exceptionthook se puedan restaurar en caso de que se reemplacen por objetos rotos.
También puede intentar iniciar ipython con la opción de establecer --xmode
a Plain
De IPython reference:
$ ipython [options] files
--xmode=<modename>
modo de informes de excepción.
Modos válidos: Normal, Contexto y Detallado.
Normal: similar a la impresión de rastreo normal de python.
Contexto: imprime 5 líneas de código fuente de contexto alrededor de cada línea en la traza.
detallado: similar al contexto, pero, además, imprime las variables actualmente visible, donde ocurrió la excepción (acortando sus cadenas si son demasiado largos). Esto puede ser muy lento, si sucede que tiene una enorme estructura de datos cuya representación de cadena es compleja para calcular. Es posible que su computadora parezca congelarse por un tiempo con el uso de la CPU al 100%. Si esto ocurre, puede cancelar el rastreo con Ctrl-C (tal vez presionarlo más de una vez).
Aquí hay algunos ejemplos de usos. Nótese la diferencia en las líneas por cada rastreo:
--xmode=Plain
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py
------------------------------------------------------------
Traceback (most recent call last):
File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
1/0
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1/0
4
5
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 19:54 [email protected] ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1/0
4
5
ZeroDivisionError: integer division or modulo by zero
y sin especificar un archivo .py:
--xmode=Plain
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain
In [1]: 1/0
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 20:03 [email protected] ~/SO/python ]$ ipython --xmode=Context
In [1]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 20:01 [email protected] ~/SO/python ]$ ipython --xmode=Verbose
In [1]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
Using the Python debugger.
Este es un error en IPython 0.11 - el rastreo se imprime después de salir del depurador, en lugar de antes de que comience. Se fijará para 0.12 (que debería estar disponible antes de Navidad). –