निम्नलिखित पायथन कार्यक्रम पर विचार करें:

code = """
def test():
    1/0
"""

filename = "<test>"

c = compile(code, filename, 'exec')
exec(c)

import linecache

linecache.cache[filename] = (len(code), None, code.splitlines(keepends=True), filename)

import traceback

print("Traceback from the traceback module:")
print()
try:
    test()
except:
    traceback.print_exc()

print()
print("Regular traceback:")
print()

test()

मैं गतिशील रूप से एक फ़ंक्शन को परिभाषित कर रहा हूं जो अपवाद उठाता है और इसे linecache में जोड़ता है। कोड का आउटपुट है

Traceback from the traceback module:

Traceback (most recent call last):
  File "test.py", line 20, in <module>
    test()
  File "<test>", line 3, in test
    1/0
ZeroDivisionError: division by zero

Regular traceback:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    test()
  File "<test>", line 3, in test
ZeroDivisionError: division by zero

अगर मुझे traceback मॉड्यूल का उपयोग करके उस फ़ंक्शन से ट्रेसबैक मिलता है, तो फ़ंक्शन से कोड की लाइन दिखाई जाती है (1/0 पहले ट्रेसबैक का हिस्सा)। लेकिन अगर मैं कोड को अपवाद उठाने देता हूं और दुभाषिया से नियमित ट्रेसबैक प्राप्त करता हूं, तो यह कोड नहीं दिखाता है।

नियमित दुभाषिया ट्रेसबैक लाइनकैश का उपयोग क्यों नहीं करता है? क्या कोड को नियमित ट्रेसबैक में प्रदर्शित करने का कोई तरीका है?

6
asmeurer 24 मई 2018, 21:10

1 उत्तर

सबसे बढ़िया उत्तर

डिफ़ॉल्ट sys.excepthook एक अलग, C- का उपयोग करता है ट्रेसबैक प्रिंटिंग का स्तर कार्यान्वयन, traceback मॉड्यूल नहीं। (शायद ऐसा इसलिए है कि यह तब भी काम करता है, भले ही सिस्टम traceback.py का उपयोग करने के लिए बहुत अधिक बोर हो।) C कार्यान्वयन linecache का उपयोग करने का प्रयास नहीं करता है। आप में स्रोत लाइनों को पुनः प्राप्त करने के लिए उपयोग किए जाने वाले कोड को देख सकते हैं। _Py_DisplaySourceLine.

यदि आप चाहते हैं कि ट्रेसबैक traceback मॉड्यूल के कार्यान्वयन का उपयोग करें, तो आप sys.excepthook को traceback.print_exception:

import sys
import traceback
sys.excepthook = traceback.print_exception
7
user2357112 supports Monica 24 मई 2018, 21:30