e.printStackTrace पायथन में बराबर


207

मुझे पता है कि print(e)(जहाँ e एक अपवाद है) घटित अपवाद को छापता है, लेकिन, मैं जावा के बराबर अजगर को खोजने की कोशिश कर रहा था, e.printStackTrace()जो अपवाद को दर्शाता है कि यह किस लाइन में हुआ और इसके पूरे निशान को छापता है।

क्या कोई मुझे e.printStackTrace()पाइथन के समकक्ष बता सकता है ?

जवाबों:


280
import traceback
traceback.print_exc()

एक except ...:ब्लॉक के अंदर ऐसा करते समय यह स्वचालित रूप से वर्तमान अपवाद का उपयोग करेगा। अधिक जानकारी के लिए http://docs.python.org/library/traceback.html देखें ।


10
यदि आप कुछ प्रकार के कंटेनर जैसे कि Jython के अंदर काम कर रहे हैं और इसलिए केवल ट्रेस प्रिंट नहीं कर सकते हैं, तो आप format_excइसके बजाय एक स्ट्रिंग प्राप्त कर सकते हैं ।
सेलेडमनेडी

116

भी है logging.exception

import logging

...

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

आउटपुट:

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

( Http://blog.tplus1.com/index.php/2007/09/28/the-python-log-module-is-much-better-than-print-statements/ के माध्यम से बिना पूर्ण ट्रेस प्रिंट कैसे करें कार्यक्रम को रोकना? )


इस बनाम के फायदे / नुकसान क्या हैं traceback.print_exc()?
नाथन

18

e.printStackTrace पायथन में बराबर

जावा में, यह निम्नलिखित ( डॉक्स ) करता है:

public void printStackTrace()

इस फेंकने योग्य प्रिंट और मानक त्रुटि धारा के लिए अपनी backtrace ...

यह इस तरह प्रयोग किया जाता है:

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

जावा में, मानक त्रुटि स्ट्रीम अप्रभावित है ताकि आउटपुट तुरंत आ जाए।

पायथन 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.

अजगर ३

पायथन 3 में, हम अपवाद ऑब्जेक्ट से सीधे ट्रेसबैक प्राप्त कर सकते हैं (जो कि थ्रेडेड कोड के लिए बेहतर व्यवहार करता है)। इसके अलावा, stderr लाइन-बफ़र्ड है , लेकिन प्रिंट फ़ंक्शन को एक फ्लश तर्क मिलता है, इसलिए इसे तुरंत stderr पर प्रिंट किया जाएगा:

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

निष्कर्ष:

पायथन 3 में, इसलिए, traceback.print_exc()हालांकि यह sys.stderr डिफ़ॉल्ट रूप से उपयोग करता है , आउटपुट को बफर करेगा, और आप संभवतः इसे खो सकते हैं। तो पायथन 3 में, जितना संभव हो उतना समान शब्दार्थ प्राप्त करने के लिए, के printसाथ उपयोग करें flush=True


3

अन्य महान उत्तर देने के लिए जोड़ा जा रहा है, हम अजगर का उपयोग कर सकते loggingलाइब्रेरी की debug(), info(), warning(), error(), और critical()तरीकों। पायथन 3.7.4 के लिए डॉक्स से उद्धरण ,

Kwargs में तीन कीवर्ड तर्क हैं जिनका निरीक्षण किया गया है: exc_info, जो यदि यह गलत के रूप में मूल्यांकन नहीं करता है, तो अपवाद जानकारी लॉगिंग संदेश में जोड़े जाने का कारण बनता है।

इसका क्या मतलब है, आप पायथन loggingलाइब्रेरी का उपयोग कर सकते हैं एक debug(), या अन्य प्रकार के संदेश को आउटपुट करने के लिए , और loggingलाइब्रेरी अपने आउटपुट में स्टैक ट्रेस को शामिल करेगा। इसे ध्यान में रखते हुए, हम निम्नलिखित कर सकते हैं:

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)

और यह उत्पादन होगा:

'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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.