सिंटैक्स एरर और अपवाद
सिंटैक्स एरर पायथन लिखने के नियम की गलती है, जैसे कोलन छूटना: if x > 5। पायथन इसे चलाने से पहले पकड़ता है और प्रोग्राम शुरू ही नहीं होता।
अपवाद वह गलती है जो प्रोग्राम चलते समय होती है, भले कोड सही लिखा हो। जैसे print(10 / n) n = 2 पर ठीक है, पर n = 0 पर गिरता है। अपवाद उठने (raise) पर कोई न पकड़े तो पायथन प्रोग्राम रोककर ट्रेसबैक छापता है।
आम बिल्ट-इन अपवाद
ZeroDivisionError: शून्य से भाग।ValueError: प्रकार सही पर मान गलत, जैसेint('abc')।TypeError: गलत प्रकार, जैसे'5' + 2।NameError: ऐसा नाम जो कभी बना ही नहीं।IndexError: लिस्ट का इंडेक्स सीमा से बाहर।KeyError: डिक्शनरी में key नहीं है।FileNotFoundError/IOError: फ़ाइल नहीं खुली।ImportError: मॉड्यूल import नहीं हुआ।EOFError: input() को फ़ाइल का अंत मिला।OverflowError,IndentationError,SyntaxErrorभी बिल्ट-इन हैं।
try और except
try:
n = int(input('Number: '))
print(100 / n)
except ZeroDivisionError:
print('शून्य से भाग नहीं')
except ValueError:
print('केवल अंक लिखें')- जो कोड गिर सकता है वह try में।
- अपवाद होते ही try का बाकी हिस्सा छूटता है और पायथन ऊपर से मेल खाता except ढूँढता है।
- एक पंक्ति में कई प्रकार:
except (ValueError, TypeError): - सादा
except:हर अपवाद पकड़ता है। इसे अंत में रखें। except ValueError as e:गलती का संदेशeमें रखता है।
else और finally
पूरा ढाँचा: try → except → else → finally।
- else तभी चलता है जब try में कोई अपवाद न हुआ हो।
- finally हमेशा चलता है: सफलता के बाद, पकड़ी गलती के बाद, न पकड़ी गलती में भी। फ़ाइल बंद करने जैसे कामों के लिए।
try:
f = open('marks.txt')
except FileNotFoundError:
print('फ़ाइल नहीं मिली')
else:
print(f.read())
f.close()
finally:
print('Done')
ख़ुद अपवाद उठाना (raise)
raise जानबूझकर अपवाद फेंकता है जब डेटा गलत हो।
age = int(input('Age: '))
if age < 0:
raise ValueError('आयु ऋणात्मक नहीं हो सकती')assert एक झटपट जाँच है: assert age >= 0, 'bad age' शर्त False होने पर AssertionError उठाता है।
करके देखें: अपना प्रोग्राम तोड़िए
दो संख्याएँ लेकर भाग देने वाला छोटा प्रोग्राम लिखिए। चलाकर 0 लिखिए, फिर 'abc' लिखिए। ट्रेसबैक में हर अपवाद का नाम नोट कीजिए। अब कोड को try में रखिए, हर एक के लिए except जोड़िए, और finally में 'धन्यवाद' छापिए। वही इनपुट फिर दीजिए। 3D के आख़िरी कदम में अनुमान लगाइए कि कौन-से खंड चलेंगे।
मुख्य सूत्र और परिभाषाएँ
- try: जोखिम वाला कोड except प्रकार: बचाव else: गलती न हो तो finally: हमेशा
- सिंटैक्स एरर: चलने से पहले · अपवाद: चलते समय
- raise प्रकार('संदेश') जानबूझकर अपवाद फेंकता है
हल किए गए उदाहरण
1. अपवाद का नाम बताइए: (a) int('12a') (b) [1,2][5] (c) {'a':1}['b'] (d) 7/0 (e) total बनाए बिना print(total)
(a) ValueError (b) IndexError (c) KeyError (d) ZeroDivisionError (e) NameError।
2. n = 0 हो तो आउटपुट: try: print(10/n) except ZeroDivisionError: print('A') else: print('B') finally: print('C')
10/0 से ZeroDivisionError → except ने A छापा। गलती हुई, तो else छूटा। finally ने C छापा। आउटपुट: A C।
3. वही कोड n = 5 के साथ। आउटपुट?
10/5 = 2.0 छपा। गलती नहीं, तो else ने B छापा। finally ने C। आउटपुट: 2.0 B C।
4. ऐसा कोड लिखिए जो तब तक पूछता रहे जब तक उपयोगकर्ता सही पूर्णांक न लिखे।
while True: try: n = int(input('Enter an integer: ')) break except ValueError: print('पूर्णांक नहीं, फिर लिखें') print('आपने लिखा', n)
5. क्या छपेगा? try: L = [1, 2] print(L[3]) print('X') except IndexError: print('Y')
L[3] से IndexError, इसलिए print('X') छूटा। except ने Y छापा। आउटपुट: Y।
6. ऐसा फ़ंक्शन लिखिए जो अंक 0 से 100 के बाहर हों तो ValueError उठाए, और उसे सुरक्षित रूप से कॉल कीजिए।
def check(m): if not 0 <= m <= 100: raise ValueError('Marks out of range') return m try: check(120) except ValueError as e: print('Error:', e) # आउटपुट: Error: Marks out of range
आम गलतियाँ
- सिंटैक्स एरर को अपवाद कहना; वह चलने से पहले मिलता है, इसलिए उसी फ़ाइल का try उसे नहीं पकड़ सकता।
- सोचना कि try में गलती के बाद की पंक्तियाँ भी चलेंगी। वे छूट जाती हैं।
- सादा except: ख़ास except से पहले रखना; वह सब कुछ पहले ही पकड़ लेता है।
- सोचना कि finally केवल गलती होने पर चलता है। वह हर बार चलता है।