e.printStackTrace equivalente in python


220

So che print(e)(dove e è un'eccezione) stampa l'eccezione verificatasi ma, stavo cercando di trovare l'equivalente python di Java e.printStackTrace()che traccia esattamente l'eccezione a quale riga si è verificata e ne stampa l'intera traccia.

Qualcuno potrebbe dirmi l'equivalente di e.printStackTrace()in Python?

Risposte:



122

C'è anche logging.exception.

import logging

...

try:
    g()
except Exception as ex:
    logging.exception("Something awful happened!")
    # will print this message followed by traceback

Produzione:

ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
  File "b.py", line 22, in f
    g()
  File "b.py", line 14, in g
    1/0
ZeroDivisionError: integer division or modulo by zero

(Da http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ tramite Come stampare il traceback completo senza interrompere il programma? )


1
Quali sono i vantaggi / svantaggi di questo rispetto traceback.print_exc()?
Nathan

21

e.printStackTrace equivalente in python

In Java, questo fa quanto segue ( documenti ):

public void printStackTrace()

Stampa questo oggetto lanciabile e il suo backtrace nel flusso di errore standard ...

Questo è usato in questo modo:

try
{ 
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}

In Java, il flusso di errore standard non è bufferizzato in modo che l'output arrivi immediatamente.

La stessa semantica in Python 2 è:

import traceback
import sys
try: # code that may raise an error
    pass 
except IOError as e: # exception handling
    # in Python 2, stderr is also unbuffered
    print >> sys.stderr, traceback.format_exc()
    # in Python 2, you can also from __future__ import print_function
    print(traceback.format_exc(), file=sys.stderr)
    # or as the top answer here demonstrates, use:
    traceback.print_exc()
    # which also uses stderr.

Python 3

In Python 3, possiamo ottenere il traceback direttamente dall'oggetto eccezione (che probabilmente si comporta meglio per il codice a thread). Inoltre, stderr è con buffer di riga , ma la funzione di stampa ottiene un argomento flush, quindi questo verrà immediatamente stampato su stderr:

    print(traceback.format_exception(None, # <- type(e) by docs, but ignored 
                                     e, e.__traceback__),
          file=sys.stderr, flush=True)

Conclusione:

In Python 3, quindi, traceback.print_exc()sebbene utilizzi sys.stderr di default , bufferizzerebbe l'output e potresti perderlo. Quindi, per ottenere la semantica più equivalente possibile, in Python 3, usa printcon flush=True.


4

Aggiungendo alle altre grandi risposte, possiamo usare Python loggingdella biblioteca debug(), info(), warning(), error(), e critical()metodi. Citando dalla documentazione per Python 3.7.4 ,

Ci sono tre argomenti di parole chiave in kwargs che vengono controllati: exc_info che, se non viene valutato come falso, fa sì che le informazioni sull'eccezione vengano aggiunte al messaggio di registrazione.

Ciò significa che puoi usare la logginglibreria Python per emettere un messaggio debug(), o un altro tipo, e la logginglibreria includerà la traccia dello stack nel suo output. Con questo in mente, possiamo fare quanto segue:

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def f():
    a = { 'foo': None }
    # the following line will raise KeyError
    b = a['bar']

def g():
    f()

try:
    g()
except Exception as e:
    logger.error(str(e), exc_info=True)

E produrrà:

'bar'
Traceback (most recent call last):
  File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
    g()
  File "<ipython-input-2-8ae09e08766b>", line 14, in g
    f()
  File "<ipython-input-2-8ae09e08766b>", line 10, in f
    b = a['bar']
KeyError: 'bar'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.