2012-01-18 17 views
8

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

मैं पूछता हूं, अगर कोशिश/ब्लॉक को छोड़कर कोड में इंडेंटेशन एरर पकड़ने का कोई तरीका है? उदाहरण के लिए, मान लें कि मैं किसी और द्वारा लिखे गए फ़ंक्शन के लिए एक परीक्षा लिख ​​रहा हूं। मैं इसे ब्लॉक/को छोड़कर कोशिश करना चाहता हूं और वह जो भी चेतावनी दे सकता है उसे संभाल सकता है। मुझे पता है, यह एक अच्छा उदाहरण नहीं है, लेकिन पहला मेरे दिमाग में आ रहा है। कृपया, उदाहरण पर ध्यान केंद्रित न करें, बल्कि समस्या पर। कोड पर

आइए नज़र:

try: 
    f() 
except IndentationError: 
    print "Error" 

print "Finished" 

समारोह:

def f(): 
    print "External function" 

और परिणाम है:

External function 
Finished 

और है कि कुछ है, मैं समझता हूँ के लिए तैयार हूँ, बाहरी समारोह में becouse इंडेंटेशन लगातार था।

लेकिन जब इस तरह समारोह देखो:

def f(): 
    print "External function" 
    print "with bad indentation" 

अपवाद बिना क्रिया है:

print "with bad indentation" 
    ^
IndentationError: unexpected indent 

किसी भी तरह से इसे प्राप्त करने के वहाँ है? मुझे लगता है कि संकलन का मामला है, और अब तक मुझे पकड़ने की कोई संभावना नहीं दिख रही है। क्या except IndentationError कोई समझ है?

+0

ध्यान दें कि 'इंडेंटेशन एरर'' सिंटेक्स एरर 'का उप-वर्ग है। –

उत्तर

11

हां, यह किया जा सकता है। हालांकि, परीक्षण के तहत कार्य को एक अलग मॉड्यूल में रहना होगा:

# test1.py 
try: 
    import test2 
except IndentationError as ex: 
    print ex 

# test2.py 
def f(): 
    pass 
     pass # error 

रन करते समय, यह सही ढंग से अपवाद को पकड़ता है। यह कुछ भी मूल्यवान नहीं है कि पूरे मॉड्यूल पर जांच एक बार में की जाती है; मुझे यकीन नहीं है कि इसे और अधिक बढ़िया बनाने का कोई तरीका है या नहीं।

5

आप pylint जैसे टूल का उपयोग कर सकते हैं, जो आपके मॉड्यूल का विश्लेषण करेगा और खराब इंडेंटेशन की रिपोर्ट करेगा, साथ ही साथ कई अन्य त्रुटियों का भी विश्लेषण करेगा।

6

IndentationError मॉड्यूल संकलित होने पर उठाया जाता है। मॉड्यूल आयात करते समय इसे पकड़ सकता है, क्योंकि मॉड्यूल को पहले आयात पर संकलित किया जाएगा। try/except युक्त उसी मॉड्यूल में इसे पकड़ नहीं सकता है, क्योंकि IndentationError के साथ, पाइथन मॉड्यूल को संकलित करने में सक्षम नहीं होगा, और मॉड्यूल में कोई कोड नहीं चलाया जाएगा।

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