इस प्रश्न का उत्तर आपके द्वारा उपयोग किए जा रहे पायथन के संस्करण पर निर्भर करता है।
पायथन 3 में
यह सरल है: अपवाद एक __traceback__
विशेषता से सुसज्जित हैं जिसमें ट्रेसबैक शामिल है। यह विशेषता भी लेखन योग्य है, और with_traceback
अपवादों की विधि का उपयोग करके आसानी से सेट किया जा सकता है:
raise Exception("foo occurred").with_traceback(tracebackobj)
इन सुविधाओं को न्यूनतम raise
प्रलेखन के भाग के रूप में वर्णित किया गया है ।
उत्तर के इस भाग का सारा श्रेय वैक्टर को जाना चाहिए, जिसने पहली बार यह जानकारी पोस्ट की थी । मैं इसे यहां केवल इसलिए शामिल कर रहा हूं क्योंकि यह उत्तर सबसे ऊपर है, और पायथन 3 अधिक आम है।
अजगर 2 में
यह कष्टप्रद जटिल है। ट्रेसबैक के साथ परेशानी यह है कि उनके पास स्टैक फ्रेम के संदर्भ हैं, और स्टैक फ्रेम में ट्रेसबैक के संदर्भ हैं जो स्टैक फ्रेम के संदर्भ हैं जिनके संदर्भ हैं ... आपको विचार मिलता है। इससे कूड़ा उठाने वाले को परेशानी होती है। ( पहली बार इसे इंगित करने के लिए परमानंद का धन्यवाद ।)
इसे हल करने का अच्छा तरीका यह होगा कि क्लॉज को छोड़ने के बाद सर्जिकल तोड़ दिया जाएexcept
, जो कि पायथन 3 करता है। पायथन 2 समाधान बहुत बदसूरत है: आपको एक तदर्थ फ़ंक्शन प्रदान किया जाता है sys.exc_info()
, जो केवल except
क्लॉज़ के अंदर काम करता है । यह अपवाद, अपवाद प्रकार, और जो कुछ भी अपवाद वर्तमान में संभाला जा रहा है, उसके लिए ट्रेसबैक युक्त टपल लौटाता है।
इसलिए यदि आप except
क्लॉज के अंदर हैं , तो आप मॉड्यूल sys.exc_info()
के साथ-साथ traceback
विभिन्न उपयोगी चीजें करने के लिए आउटपुट का उपयोग कर सकते हैं:
>>> import sys, traceback
>>> def raise_exception():
... try:
... raise Exception
... except Exception:
... ex_type, ex, tb = sys.exc_info()
... traceback.print_tb(tb)
... finally:
... del tb
...
>>> raise_exception()
File "<stdin>", line 3, in raise_exception
लेकिन जैसा कि आपका संपादन इंगित करता है, आप ट्रेसबैक प्राप्त करने की कोशिश कर रहे हैं जो कि आपके अपवाद को नियंत्रित न करने पर मुद्रित किया गया होता , क्योंकि यह पहले ही संभाला जा चुका है । यह बहुत कठिन सवाल है। दुर्भाग्य से, कोई अपवाद नहीं होने पर sys.exc_info
रिटर्न (None, None, None)
। अन्य संबंधित sys
विशेषताएँ भी मदद नहीं करती हैं। sys.exc_traceback
कोई अपवाद नहीं होने पर पदावनत और अपरिभाषित है; sys.last_traceback
सही लगता है, लेकिन यह केवल इंटरेक्टिव सत्रों के दौरान परिभाषित किया गया प्रतीत होता है।
यदि आप यह नियंत्रित कर सकते हैं कि अपवाद कैसे उठाया जाता है, तो आप कुछ जानकारी संग्रहीत करने के लिए उपयोग करने में सक्षम हो सकते हैं inspect
और एक कस्टम अपवाद हो सकता है । लेकिन मुझे पूरी तरह से यकीन नहीं है कि यह कैसे काम करेगा।
सच्चाई बताने के लिए, एक अपवाद को पकड़ना और वापस करना एक असामान्य बात है। यह एक संकेत हो सकता है कि आपको वैसे भी रिफ्लेक्टर करने की आवश्यकता है।