mechmind जवाब के रूप में, स्टैक ट्रेस केवल साइट है, जहां अपवाद के बीच फ्रेम के होते हैं उठाया गया था और try
ब्लॉक की साइट। यदि आपको पूर्ण स्टैक ट्रेस की ज़रूरत है, तो जाहिर है कि आप भाग्य से बाहर हैं।
सिवाय इसके कि शीर्ष स्तर से वर्तमान फ्रेम तक स्टैक प्रविष्टियों को निकालना संभव है- traceback.extract_stack
इसे ठीक से प्रबंधित करता है। समस्या यह है कि traceback.extract_stack
द्वारा प्राप्त जानकारी किसी भी बिंदु पर ट्रेसबैक ऑब्जेक्ट के बिना स्टैक फ्रेम के प्रत्यक्ष निरीक्षण से आता है, और logging
एपीआई को ट्रेसबैक आउटपुट को प्रभावित करने के लिए ट्रेसबैक ऑब्जेक्ट की आवश्यकता होती है।
सौभाग्य से, logging
एक वास्तविक ट्रैस बैक वस्तु की आवश्यकता नहीं है, यह एक वस्तु की आवश्यकता है कि यह traceback
मॉड्यूल के स्वरूपण दिनचर्या को पारित कर सकते हैं। traceback
या तो परवाह नहीं करता है-यह केवल ट्रेसबैक, फ्रेम और रेखा संख्या के दो विशेषताओं का उपयोग करता है। इसलिए, बतख-टाइप की गई फॉक्स-ट्रेसबैक ऑब्जेक्ट्स की एक लिंक की गई सूची बनाना और ट्रेसबैक के रूप में इसे पास करना संभव होना चाहिए।
import logging
def func():
try:
raise Exception('Dummy')
except:
logging.error("Something awful happened!", exc_info=full_exc_info())
def func2():
func()
func2()
... अपेक्षित आउटपुट देने के लिए:
import sys
class FauxTb(object):
def __init__(self, tb_frame, tb_lineno, tb_next):
self.tb_frame = tb_frame
self.tb_lineno = tb_lineno
self.tb_next = tb_next
def current_stack(skip=0):
try: 1/0
except ZeroDivisionError:
f = sys.exc_info()[2].tb_frame
for i in xrange(skip + 2):
f = f.f_back
lst = []
while f is not None:
lst.append((f, f.f_lineno))
f = f.f_back
return lst
def extend_traceback(tb, stack):
"""Extend traceback with stack info."""
head = tb
for tb_frame, tb_lineno in stack:
head = FauxTb(tb_frame, tb_lineno, head)
return head
def full_exc_info():
"""Like sys.exc_info, but includes the full traceback."""
t, v, tb = sys.exc_info()
full_tb = extend_traceback(tb, current_stack(1))
return t, v, full_tb
जगह में इन कार्यों के साथ
, अपने कोड केवल एक छोटी सी संशोधन की आवश्यकता है
ERROR:root:Something awful happened!
Traceback (most recent call last):
File "a.py", line 52, in <module>
func2()
File "a.py", line 49, in func2
func()
File "a.py", line 43, in func
raise Exception('Dummy')
Exception: Dummy
ध्यान दें कि छद्म-ट्रैस बैक वस्तुओं को आत्मनिरीक्षण-स्थानीय चर प्रदर्शित करने के लिए पूरी तरह उपयोग करने योग्य हैं या pdb.post_mortem()
पर तर्क के रूप में - क्योंकि वे असली स्टैक फ्रेम के संदर्भ हैं।
संभावित डुप्लिकेट [एक चर में traceback/sys.exc \ _info() मानों को कैसे सहेजना है?] (Http://stackoverflow.com/questions/8238360/how-to-save-traceback-sys-exc- जानकारी-मूल्य-इन-ए-वेरिएबल) – Nathan
@ नाथन, कृपया प्रश्न को सावधानी से दोबारा पढ़ें। ** पूर्ण ** ट्रेसबैक की आवश्यकता है। – warvariuc
देखें [पायथन में अपवादों के लिए पूर्ण स्टैक निशान उत्पन्न करना।] (Http://blog.dscpl.com.au/2015/03/generating-full-stack-traces-for.html) ग्राहम डुप्लेटन द्वारा ब्लॉग पोस्ट। –