python'da e.printStackTrace eşdeğeri


207

Biliyorum print(e)(e bir istisna olduğu yerde) oluşan istisna yazdırır, ancak Java'nın python eşdeğerini bulmaya çalışıyordu e.printStackTrace(), tam olarak hangi çizginin gerçekleştiğini izler ve tüm izini yazdırır.

Birisi bana e.printStackTrace()Python eşdeğerini söyleyebilir misiniz ?

Yanıtlar:



116

Ayrıca var logging.exception.

import logging

...

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

Çıktı:

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

(Gönderen http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ aracılığı olmadan tam Traceback yazdırmak için nasıl programın durdurulması? )


Bunun karşısındaki avantajları / dezavantajları traceback.print_exc()nelerdir?
Nathan

18

python'da e.printStackTrace eşdeğeri

Java'da bu aşağıdakileri yapar ( dokümanlar ):

public void printStackTrace()

Bu atılabilir ve standart iz akışına olan geri izini yazdırır ...

Bu şu şekilde kullanılır:

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

Java'da, çıktı hemen gelmesi için Standart Hata akışı arabelleğe alınmaz.

Python 2'deki aynı semantik:

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

Python 3'te, izleme işlemini doğrudan istisna nesnesinden alabiliriz (büyük olasılıkla dişli kod için daha iyi davranır). Ayrıca, stderr satır arabelleğe alınır , ancak yazdırma işlevi bir floş argümanı alır, bu nedenle hemen stderr'a yazdırılır:

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

Sonuç:

Bu nedenle, Python 3'te, varsayılan olaraktraceback.print_exc() kullansa da , çıktıyı arabelleğe alır ve muhtemelen kaybedebilirsiniz. Mümkün olduğunca eşdeğer anlambilim elde etmek için Python 3'te ile kullanın .sys.stderr printflush=True


3

Diğer büyük cevaplara ekleme, biz Python kullanabilirsiniz loggingkütüphanenin debug(), info(), warning(), error(), ve critical()yöntemleri. Python 3.7.4 için dokümanlardan alıntı yaparak ,

Kwargs içinde denetlenen üç anahtar kelime bağımsız değişkeni vardır: exc_info, yanlış olarak değerlendirilmezse, günlük iletisine özel durum bilgilerinin eklenmesine neden olur.

Bunun anlamı, logginga debug()veya başka bir mesaj türü için Python kitaplığını kullanabilirsiniz ve kitaplık çıktısında loggingyığın izlemeyi içerecektir. Bunu göz önünde bulundurarak şunları yapabiliriz:

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)

Ve çıktı:

'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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.