validar try tipos sirve recent que por para most last imprimir exceptions excepciones example error ejemplos diferentes catch all python debugging

try - Iniciando el depurador de Python automáticamente en caso de error



try except python example (12)

Coloque un punto de interrupción dentro del constructor de la clase de excepción más alta en la jerarquía, y la mayoría de las veces verá dónde se generó el error.

Poner un punto de ruptura significa lo que quieras que signifique: puedes usar un IDE, o pdb.set_trace , o lo que sea

Esta es una pregunta que me he preguntado durante bastante tiempo, pero nunca he encontrado una solución adecuada. Si ejecuto un script y me encuentro, digamos un IndexError, python imprime la línea, ubicación y descripción rápida del error y sale. ¿Es posible iniciar automáticamente pdb cuando se encuentra un error? No estoy en contra de tener una declaración de importación adicional en la parte superior del archivo, ni unas pocas líneas adicionales de código.


Este no es el depurador, pero probablemente igual de útil (?)

Sé que escuché a Guido mencionar esto en un discurso en alguna parte.

Acabo de comprobar Python, y si usa el comando -i puede interactuar donde se detuvo su script.

Entonces, dado este guión:

testlist = [1,2,3,4,5, 0] prev_i = None for i in testlist: if not prev_i: prev_i = i else: result = prev_i/i

¡Puedes obtener esta salida!

PS D:/> python -i debugtest.py Traceback (most recent call last): File "debugtest.py", line 10, in <module> result = prev_i/i ZeroDivisionError: integer division or modulo by zero >>> >>> >>> prev_i 1 >>> i 0 >>>

Para ser honesto, no lo he usado, pero debería serlo, parece muy útil.


IPython lo hace simple en la línea de comando:

python myscript.py arg1 arg2

puede ser reescrito para

ipython --pdb myscript.py -- arg1 arg2

O, de manera similar, si llama a un módulo:

python -m mymodule arg1 arg2

puede ser reescrito para

ipython --pdb -m mymodule -- arg1 arg2

Tenga en cuenta que para evitar que IPython lea los argumentos del script como propios.

Esto también tiene la ventaja de invocar el depurador de IPython mejorado (ipdb) en lugar de pdb.


Para ejecutarlo sin tener que escribir c al inicio, use:

python -m pdb -c c <script name>

Pdb tiene sus propios argumentos de línea de comando: -cc ejecutará el comando c (ontinue) al inicio de la ejecución y el programa se ejecutará ininterrumpidamente hasta el error.


Puede usar traceback.print_exc para imprimir el rastreo de excepciones. Luego use sys.exc_info para extraer el traceback y finalmente llame a pdb.post_mortem con ese traceback

import pdb, traceback, sys def bombs(): a = [] print a[0] if __name__ == ''__main__'': try: bombs() except: type, value, tb = sys.exc_info() traceback.print_exc() pdb.post_mortem(tb)

Si desea iniciar una línea de comando interactiva con code.interact utilizando los locales del marco donde se originó la excepción, puede hacer

import traceback, sys, code def bombs(): a = [] print a[0] if __name__ == ''__main__'': try: bombs() except: type, value, tb = sys.exc_info() traceback.print_exc() last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb frame = last_frame().tb_frame ns = dict(frame.f_globals) ns.update(frame.f_locals) code.interact(local=ns)



Si está ejecutando un módulo:

python -m mymodule

Y ahora quiere ingresar pdb cuando ocurre una excepción, haga esto:

PYTHONPATH="." python -m pdb -c c mymodule/__main__.py

(o amplíe su PYTHONPATH ). El PYTHONPATH es necesario para que el módulo se encuentre en la ruta, ya que está ejecutando el módulo pdb ahora.


Si está utilizando el entorno IPython, puede usar% depuración y el shell lo llevará de vuelta a la línea ofensiva con el entorno ipdb para inspecciones, etc. Otra opción, como se señaló anteriormente, es usar el iPython magic% pdb que efectivamente funciona lo mismo.


Use el siguiente módulo:

import sys def info(type, value, tb): if hasattr(sys, ''ps1'') or not sys.stderr.isatty(): # we are in interactive mode or we don''t have a tty-like # device, so we call the default hook sys.__excepthook__(type, value, tb) else: import traceback, pdb # we are NOT in interactive mode, print the exception... traceback.print_exception(type, value, tb) print # ...then start the debugger in post-mortem mode. # pdb.pm() # deprecated pdb.post_mortem(tb) # more "modern" sys.excepthook = info

Nombralo debug (o lo que quieras) y ponlo en algún lugar de tu ruta python.

Ahora, al comienzo de su script, simplemente agregue una import debug .


python -m pdb script.py en python2.7 presione continuar para iniciar y se ejecutará con el error y se dividirá allí para la depuración.


Ipython tiene un comando para alternar este comportamiento: % pdb . Hace exactamente lo que describió, tal vez incluso un poco más (proporcionándole trazas más informativas con resaltado de sintaxis y finalización de código). ¡Definitivamente vale la pena intentarlo!


python -m pdb -c continue myscript.py

Si no proporciona el indicador -c continue , entonces deberá ingresar ''c'' (para Continuar) cuando comience la ejecución. Luego se ejecutará hasta el punto de error y le dará el control allí. Como lo menciona eqzx , este indicador es una nueva adición en python 3.2 por lo que es necesario ingresar "c" para las versiones anteriores de Python (consulte https://docs.python.org/3/library/pdb.html ).