2010-04-10 16 views
7

जब मुझे मानक लाइब्रेरी से रनटाइम अपवाद मिलता है, तो यह हमेशा मेरे कोड में एक समस्या है, न कि लाइब्रेरी कोड में। क्या अपवाद स्टैक ट्रेस को छोटा करने का कोई तरीका है ताकि यह लाइब्रेरी पैकेज की गड़बड़ी न दिखाए?पायथन: लाइब्रेरी कोड में स्टैक निशान को समाप्त करना?

उदाहरण के लिए, मैं इस प्राप्त करना चाहते हैं:

Traceback (most recent call last): 
    File "./lmd3-mkhead.py", line 71, in <module> 
    main() 
    File "./lmd3-mkhead.py", line 66, in main 
    create() 
    File "./lmd3-mkhead.py", line 41, in create 
    headver1[depotFile]=rev 
TypeError: Data values must be of type string or None. 

और इस नहीं:

Traceback (most recent call last): 
    File "./lmd3-mkhead.py", line 71, in <module> 
    main() 
    File "./lmd3-mkhead.py", line 66, in main 
    create() 
    File "./lmd3-mkhead.py", line 41, in create 
    headver1[depotFile]=rev 
    File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/__init__.py", line 276, in __setitem__ 
    _DeadlockWrap(wrapF) # self.db[key] = value 
    File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/dbutils.py", line 68, in DeadlockWrap 
    return function(*_args, **_kwargs) 
    File "/usr/anim/modsquad/oses/fc11/lib/python2.6/bsddb/__init__.py", line 275, in wrapF 
    self.db[key] = value 
TypeError: Data values must be of type string or None. 

अद्यतन: कोड के साथ एक answer कहा, एलेक्स से सूचक के लिए धन्यवाद।

उत्तर

2

एलेक्स से सूचक के लिए धन्यवाद, यहाँ तेह codez है:

def trimmedexceptions(type, value, tb, pylibdir=None, lev=None): 
    """trim system packages from the exception printout""" 
    if pylibdir is None: 
     import traceback, distutils.sysconfig 
     pylibdir = distutils.sysconfig.get_python_lib(1,1) 
     nlev = trimmedexceptions(type, value, tb, pylibdir, 0) 
     traceback.print_exception(type, value, tb, nlev) 
    else: 
     fn = tb.tb_frame.f_code.co_filename 
     if tb.tb_next is None or fn.startswith(pylibdir): 
      return lev 
     else: 
      return trimmedexceptions(type, value, tb.tb_next, pylibdir, lev+1) 

import sys 
sys.excepthook=trimmedexceptions 

# --- test code --- 

def f1(): f2() 
def f2(): f3() 
def f3(): 
    import xmlrpclib 
    proxy = xmlrpclib.ServerProxy('http://nosuchserver') 
    proxy.f() 

f1() 

कौन इस स्टैक ट्रेस पैदावार:

Traceback (most recent call last): 
    File "./tsttraceback.py", line 47, in <module> 
    f1() 
    File "./tsttraceback.py", line 40, in f1 
    def f1(): f2() 
    File "./tsttraceback.py", line 41, in f2 
    def f2(): f3() 
    File "./tsttraceback.py", line 45, in f3 
    proxy.f() 
gaierror: [Errno -2] Name or service not known 
0

एक अयोग्य प्रयास करें ... अपने कोड के शीर्ष पर छोड़कर (यानी: अपने "मुख्य" में) या sys.excepthook सेट करें। फिर आप स्टैक ट्रेस को प्रारूपित कर सकते हैं, हालांकि आप चाहें।

1

Traceback library शायद आप जो चाहते हैं।

import traceback 

try: 
    your_main() 
except: 
    lines = traceback.format_exc() 
    print lines[:lines.find('File "/usr')] 

(यह स्पष्ट रूप से अगर कोई पुस्तकालय के बाहर एक अपवाद है काम नहीं करेगा, और वास्तव में नहीं आपकी आवश्यकताओं को हो सकता है, लेकिन यह ट्रैस बैक लाइब्रेरी का उपयोग करने का एक तरीका है)

10
: यहाँ एक उदाहरण है कि मदद कर सकता है है

पाइथन की मानक लाइब्रेरी में traceback मॉड्यूल आपको त्रुटि ट्रेसबैक को इस तरह से उत्सर्जित करने देता है जो आपकी पसंद के अनुरूप है, जबकि एक अपवाद प्रचारित हो रहा है। आप try/except कथन के चरण में या sys.excepthook के रूप में स्थापित फ़ंक्शन में इस शक्ति का उपयोग कर सकते हैं, जिसे कहा जाता है कि जब कोई अपवाद सभी तरह से प्रचारित होता है; यह तब होता है बस से पहले नियंत्रण शीघ्र करने के लिए दिया जाता है एक इंटरैक्टिव सत्र में

;: डॉक्स के हवाले एक पायथन कार्यक्रम में यह प्रोग्राम से बाहर निकलने से ठीक पहले होता है। ऐसे शीर्ष-स्तरीय अपवादों का संचालन द्वारा अनुकूलित किया जा सकता है जो sys.excepthook पर एक और तीन-तर्क फ़ंक्शन निर्दिष्ट करता है।

यहाँ एक सरल, कृत्रिम उदाहरण है:

>>> import sys 
>>> import traceback 
>>> def f(n): 
... if n<=0: raise ZeroDivisionError 
... f(n-1) 
... 
>>> def excepthook(type, value, tb): 
... traceback.print_exception(type, value, tb, 3) 
... 
>>> sys.excepthook = excepthook 
>>> f(8) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in f 
    File "<stdin>", line 3, in f 
ZeroDivisionError 

जैसा कि आप देख, एक try/except की जरूरत के बिना, आप आसानी से ट्रैस बैक करने के लिए सीमित कर सकते हैं पहले तीन स्तर (उदाहरण के लिए) - भले ही हम डिज़ाइन से जानते हैं कि अपवाद उठाए जाने पर 9 नेस्टेड स्तर थे।

आप स्तरों पर एक साधारण सीमा से कुछ अधिक परिष्कृत चाहते हैं, तो आपको traceback.format_exception पर कॉल करने की आवश्यकता होगी, जो आपको इसे प्रिंट करने के बजाय लाइनों की एक सूची देता है, फिर उस सूची से "prune" मॉड्यूल के बारे में बताता है आप कभी भी अपने ट्रेसबैक में नहीं देखना चाहते हैं, और आखिरकार शेष पंक्तियों को छोड़ दें (आमतौर पर sys.stderr पर, लेकिन, जो भी हो! -)।

+0

शुद्ध आसुत ज्ञान, शैली का एक पानी का छींटा के साथ मिश्रित ... धन्यवाद एलेक्स! –

+0

@ मार्क, आपका स्वागत है - कुडोस के लिए धन्यवाद! –

संबंधित मुद्दे