2010-03-01 10 views
17

जब एक अपवाद अजगर में होता है, तो आप ढेर निरीक्षण कर सकते हैं? क्या आप इसकी गहराई को निर्धारित कर सकते हैं? मैंने traceback मॉड्यूल को देखा है, लेकिन मैं इसका उपयोग नहीं कर सकता हूं।पाइथन में अपवाद के स्टैक ट्रेस का प्रोग्रामेटिक रूप से निरीक्षण कैसे कर सकते हैं?

मेरा लक्ष्य किसी भी कार्यवाही द्वारा फेंकने वाले अपवादों को पकड़ने के बिना किसी अपवाद अभिव्यक्ति के विश्लेषण के दौरान होने वाले किसी भी अपवाद को पकड़ना है। Eval का उपयोग करने के लिए मुझे बेरेट मत करो। यह मेरा निर्णय नहीं था।

नोट: मैं सहभागी नहीं प्रोग्राम के रूप में यह करने के लिए, चाहते हैं।

उत्तर

6

आप inspect मॉड्यूल का उपयोग कर सकते हैं जिसमें ट्रेसिंग के लिए कुछ उपयोगिता कार्य हैं। फ्रेम ऑब्जेक्ट्स के overview of properties पर एक नज़र डालें।

13

traceback पर्याप्त है - और मुझे लगता है कि दस्तावेज़ीकरण इसका वर्णन करता है। सरलीकृत उदाहरण:

import sys 
import traceback 

try: 
    eval('a') 
except NameError: 
    traceback.print_exc(file=sys.stdout) 
+2

मैं ट्रैस बैक प्रिंट करने का प्रयास नहीं कर रहा हूँ। मैं इसका निरीक्षण करने की कोशिश कर रहा हूं। यह मुझे कैसे बताता है कि अपवाद पाठ में अपवाद हुआ है, या मूल्यांकन किए गए पाठ द्वारा बुलाए गए फ़ंक्शन में? –

+0

'eval' टेक्स्ट गलत है तो SyntaxError फेंक दिया जाएगा। –

+0

अगर eval टेक्स्ट गलत है तो कई अलग-अलग प्रकार की त्रुटियों को फेंक दिया जा सकता है।मैं निरीक्षण का उपयोग कर समाप्त हुआ और यह देखने के लिए कि क्या मूल पाठ का मूल्यांकन करके त्रुटि हुई थी, या यदि यह एक बुलाए गए फ़ंक्शन के शरीर में था, तो ट्रेसबैक की गहराई को देखकर समाप्त हो गया। –

0

inspect के बारे में AndiDog के जवाब के अलावा, ध्यान दें कि pdb आप नेविगेट करने और ढेर नीचे, स्थानीय लोगों और इस तरह की चीजों का निरीक्षण करने देता है। मानक पुस्तकालय pdb.py में स्रोत आपके लिए ऐसी चीजों को कैसे करना है, सीखने में सहायक हो सकता है।

4

मैं ट्रैस बैक मॉड्यूल की तरह।

आप sys.exc_info() का उपयोग कर एक ट्रेसबैक ऑब्जेक्ट प्राप्त कर सकते हैं। तो फिर तुम उस वस्तु का उपयोग traceback.extract_tb() का उपयोग कर ट्रैस बैक प्रविष्टियों की एक सूची preprocessed सूची प्राप्त कर सकते हैं। http://docs.python.org/library/sys.html

और ट्रैस बैक मॉड्यूल:: http://docs.python.org/library/traceback.html

1

आप इस तरह के एक समारोह को परिभाषित():

import sys 
import traceback, inspect 

try: 
    f = open("nonExistant file",'r') 
except: 
    (exc_type, exc_value, exc_traceback) = sys.exc_info() 
    #print exception type 
    print exc_type 
    tb_list = traceback.extract_tb(sys.exc_info()[2]) 
    tb_list = traceback.format_list(tb_list) 
    for elt in tb_list: 
     print elt 
     #Do any processing you need here. 

sys मॉड्यूल देखें: तो फिर तुम traceback.format_list() का उपयोग कर एक पठनीय सूची इस प्रकार है प्राप्त कर सकते हैं

def raiseErr(): 
    for f in inspect.stack(): print '-', inspect.getframeinfo(f[0]) 

और इसे अपने मॉड्यूल से कॉल करें ताकि:

raiseErr() 

फ़ंक्शन raise Err उस स्थान के बारे में जानकारी प्रिंट करेगा जिसे आपने कहा था।

अधिक विस्तृत, तो आप ऐसा कर सकते हैं:

def tr(): 
    print '* - '*10, 
    print sys._getframe(1).f_code.co_name 

और जगह है जहाँ आप का पता लगाने चाहते हैं, उसमें यह कहते हैं:

import inspect, traceback 
A = [inspect.getframeinfo(f[0]) for f in inspect.stack()] 
print "traceback structure fields:", filter(lambda s: s[0] != '_', dir(A[0])) 
print A[0].filename, A[0].lineno 
for f in inspect.stack(): 
    F = inspect.getframeinfo(f[0]) 
    print '-', F.filename, F.lineno, '\t', F.code_context[0].strip() 

अन्य संभावना इस समारोह को परिभाषित करने के लिए है। यदि आप सभी ट्रेस चाहते हैं, तो _getframe(1) में 1 से एक इटरेटर बनाएं।

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