e.printStackTrace setara dengan python

208

Saya tahu bahwa print(e)(di mana e adalah Pengecualian) mencetak pengecualian yang terjadi tetapi, saya mencoba untuk menemukan python yang setara dengan Java e.printStackTrace()yang secara tepat melacak pengecualian pada baris apa yang terjadi dan mencetak seluruh jejaknya.

Adakah yang bisa tolong beri tahu saya setara dengan e.printStackTrace()di Python?

koool
sumber

Jawaban:

281
import traceback
traceback.print_exc()

Saat melakukan ini di dalam except ...:blok, ia akan secara otomatis menggunakan pengecualian saat ini. Lihat http://docs.python.org/library/traceback.html untuk informasi lebih lanjut.

Pencuri
sumber
10
Jika Anda bekerja di dalam semacam wadah seperti Jython dan karena itu tidak bisa hanya mencetak jejak, Anda bisa format_excmendapatkan string.
SeldomNeedy
116

Ada juga logging.exception.

import logging

...

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

Keluaran:

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

(Dari http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ melalui Cara mencetak traceback penuh tanpa menghentikan program? )

david.libremone
sumber
Apa kelebihan / kekurangan dari ini versus traceback.print_exc()?
Nathan
18

e.printStackTrace setara dengan python

Di Jawa, ini melakukan yang berikut ( dokumen ):

public void printStackTrace()

Mencetak throwable ini dan backtrace ke aliran kesalahan standar ...

Ini digunakan seperti ini:

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

Di Jawa, aliran Kesalahan Standar tidak dibatalkan sehingga output segera tiba.

Semantik yang sama dalam Python 2 adalah:

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

Dalam Python 3, kita bisa mendapatkan traceback langsung dari objek pengecualian (yang mungkin berperilaku lebih baik untuk kode ulir). Juga, stderr adalah buffer-line , tetapi fungsi cetak mendapat argumen flush, jadi ini akan segera dicetak ke stderr:

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

Kesimpulan:

Dalam Python 3, oleh karena itu, traceback.print_exc()meskipun digunakan sys.stderr secara default , akan buffer output, dan Anda mungkin kehilangan itu. Jadi untuk mendapatkan semantik yang sederajat mungkin, dengan Python 3, gunakan printdengan flush=True.

Aaron Hall
sumber
3

Menambah jawaban besar lainnya, kita dapat menggunakan Python loggingperpustakaan debug(), info(), warning(), error(), dan critical()metode. Mengutip dari dokumen untuk Python 3.7.4 ,

Ada tiga argumen kata kunci dalam kwarg yang diperiksa: exc_info yang, jika tidak dievaluasi salah, menyebabkan informasi pengecualian ditambahkan ke pesan logging.

Artinya, Anda bisa menggunakan loggingpustaka Python untuk menampilkan a debug(), atau jenis pesan lainnya, dan loggingpustaka akan menyertakan jejak stack dalam outputnya. Dengan mengingat hal ini, kita dapat melakukan hal berikut:

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)

Dan itu akan menampilkan:

'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'
MikeyE
sumber