कंप्यूटर प्रोग्राम चलाते समय कई बार ऐसी स्थितियाँ उत्पन्न होती हैं जो प्रोग्राम के सामान्य निष्पादन को बाधित कर देती हैं। जैसे किसी फाइल को पढ़ने का प्रयास करना जो मौजूद ही नहीं है, या किसी संख्या को शून्य से विभाजित करना। प्रोग्रामिंग की भाषा में ऐसी अप्रत्याशित घटनाओं को अपवाद (Exception) कहा जाता है। अपवाद प्रबंधन (Exception Handling) एक ऐसी तकनीक है जिसके द्वारा हम प्रोग्राम को दुर्घटनाग्रस्त (crash) होने से बचाते हैं और उसे वैकल्पिक रूप से आगे बढ़ने की सुविधा प्रदान करते हैं। पाइथन (Python) में अपवादों को संभालने के लिए try, except, else, finally और raise जैसे कीवर्ड का उपयोग किया जाता है। अपवाद प्रबंधन का मुख्य लाभ यह है कि प्रोग्राम अचानक रुकने के बजाय उपयोगकर्ता को स्पष्ट संदेश देकर सुरक्षित रूप से समाप्त होता है या सही प्रवाह में आगे बढ़ता है।
यदि कोई अपवाद नहीं पकड़ा जाता है, तो इंटरप्रेटर एक एरर ट्रेसबैक (traceback) प्रदर्शित करता है और प्रोग्राम का निष्पादन रुक जाता है। उदाहरण के लिए, नीचे दिया गया कोड एक ZeroDivisionError उत्पन्न करेगा:
num = 10
den = 0
result = num / den # ZeroDivisionError
print(result)
पाइथन में त्रुटि (Error) और अपवाद (Exception) को भिन्न अवधारणाओं के रूप में समझना आवश्यक है। सिंटैक्स एरर (Syntax Error) उस समय उत्पन्न होता है जब हमने पाइथन के व्याकरण नियमों का उल्लंघन किया होता है, जैसे कोष्ठक (bracket) को बंद न करना या इंडेंटेशन (indentation) की गलती करना। ऐसी त्रुटियाँ कोड के लिखे जाने के समय ही पकड़ ली जाती हैं और प्रोग्राम बिल्कुल नहीं चलता। इसके विपरीत, अपवाद (Exception) वे त्रुटियाँ हैं जो प्रोग्राम के निष्पादन (runtime) के दौरान उत्पन्न होती हैं, जैसे NameError, TypeError, ValueError, IndexError आदि। अपवादों को try-except ब्लॉक की सहायता से पकड़ा और प्रबंधित किया जा सकता है, जबकि सिंटैक्स एरर को प्रोग्राम के स्तर पर नहीं पकड़ा जा सकता।
ZeroDivisionError: किसी संख्या को शून्य से विभाजित करने पर।NameError: ऐसे चर या नाम का उपयोग करने पर जो परिभाषित नहीं है।TypeError: अनुपयुक्त प्रकार की वस्तुओं पर ऑपरेशन करने पर।ValueError: फलन को तर्क (argument) सही प्रकार का पर गलत मान के साथ देने पर।IndexError: सूची में अनुपलब्ध अनुक्रमांक (index) को एक्सेस करने पर।KeyError: शब्दकोश (dictionary) में अनुपलब्ध कुंजी (key) को एक्सेस करने पर।FileNotFoundError: ऐसी फाइल खोलने पर जो मौजूद नहीं है।ImportError: ऐसे मॉड्यूल को आयात करने पर जो उपलब्ध नहीं है।IOError: इनपुट/आउटपुट ऑपरेशन विफल होने पर।पाइथन में अपवाद प्रबंधन try और except ब्लॉक की सहायता से किया जाता है। जिस कोड में अपवाद आने की संभावना होती है उसे try ब्लॉक के अंदर लिखा जाता है, और अपवाद उत्पन्न होने पर उसे संभालने का कोड except ब्लॉक में लिखा जाता है। इसका मूल सिंटैक्स इस प्रकार है:
try:
# संदिग्ध कोड जिसमें अपवाद आ सकता है
result = 10 / 0
except:
# अपवाद उत्पन्न होने पर चलने वाला कोड
print("शून्य से विभाजन संभव नहीं है")
बेहतर अभ्यास यह है कि हम सामान्य रूप से सभी अपवादों को पकड़ने के बजाय विशिष्ट अपवाद को पकड़ें। उदाहरण के लिए:
try:
num = int(input("एक संख्या दर्ज करें: "))
print(100 / num)
except ValueError:
print("कृपया केवल संख्या दर्ज करें")
except ZeroDivisionError:
print("शून्य से विभाजन संभव नहीं है")
पाइथन में हम एक ही except स्टेटमेंट में टपल (tuple) के माध्यम से कई अपवादों को भी पकड़ सकते हैं:
try:
value = int(input("संख्या दर्ज करें: "))
print(100 // value)
except (ValueError, ZeroDivisionError) as e:
print("त्रुटि उत्पन्न हुई:", e)
else क्लॉज तभी निष्पादित होता है जब try ब्लॉक में कोई अपवाद नहीं आता है। यह कोड को अलग रखने में सहायक होता है:
try:
num = int(input("संख्या दर्ज करें: "))
except ValueError:
print("अमान्य इनपुट!")
else:
print("आपने दर्ज किया:", num)
print("कोई अपवाद नहीं आया")
finally ब्लॉक हमेशा निष्पादित होता है, चाहे अपवाद आए या न आए। इसका उपयोग मुख्य रूप से संसाधनों को मुक्त करने के लिए किया जाता है, जैसे फाइल को बंद करना या डेटाबेस कनेक्शन समाप्त करना:
try:
f = open("data.txt", "r")
print(f.read())
except FileNotFoundError:
print("फाइल नहीं मिली")
finally:
print("यह हमेशा चलेगा")
f.close()
कभी-कभी प्रोग्रामर स्वयं चाहता है कि किसी विशेष स्थिति में एक अपवाद उत्पन्न किया जाए। इसके लिए raise स्टेटमेंट का उपयोग किया जाता है। यह विशेष रूप से तब उपयोगी होता है जब हम फलन के अंदर अमान्य इनपुट की जाँच करना चाहते हैं:
def check_age(age):
if age < 0:
raise ValueError("आयु ऋणात्मक नहीं हो सकती")
print("आयु स्वीकार्य है")
check_age(-5)
पाइथन में सभी अपवादों की जड़ BaseException है, और उसके बाद Exception क्लास आती है। अधिकांश व्यावहारिक अपवाद Exception से व्युत्पन्न (derived) होते हैं। मुख्य श्रेणीबद्ध संरचना इस प्रकार है:
BaseException
└── SystemExit, KeyboardInterrupt, GeneratorExit
└── Exception
├── ArithmeticError (ZeroDivisionError, OverflowError)
├── LookupError (IndexError, KeyError)
├── ValueError
├── TypeError
├── IOError / OSError (FileNotFoundError)
└── NameError
जब हम अपना स्वयं का अपवाद बनाना चाहते हैं, तो हम Exception क्लास का उपयोग करते हैं:
class MarksError(Exception):
pass
marks = int(input("अंक दर्ज करें: "))
if marks > 100 or marks < 0:
raise MarksError("अंक 0 से 100 के बीच होने चाहिए")
अपवाद प्रबंधन का उपयोग करने के अनेक लाभ हैं। सबसे पहले, यह प्रोग्राम को क्रैश होने से बचाता है और उपयोगकर्ता को सार्थक त्रुटि संदेश देता है। दूसरे, यह त्रुटि-संभावित कोड को सामान्य कोड से अलग करता है, जिससे कोड अधिक पठनीय बनता है। तीसरे, finally ब्लॉक के माध्यम से यह सुनिश्चित करता है कि महत्वपूर्ण सफाई कार्य हमेशा संपन्न हों। अंत में, एक प्रोग्राम में एक से अधिक except ब्लॉक लिखकर हम विभिन्न प्रकार की त्रुटियों के लिए अलग-अलग प्रतिक्रियाएँ निर्धारित कर सकते हैं।
मान लीजिए हमें एक प्रोग्राम लिखना है जो दो संख्याओं को विभाजित करे और संभावित सभी त्रुटियों को संभाले:
while True:
try:
a = int(input("पहली संख्या: "))
b = int(input("दूसरी संख्या: "))
print("भागफल:", a / b)
break
except ValueError:
print("कृपया सही संख्या दर्ज करें")
except ZeroDivisionError:
print("शून्य से भाग संभव नहीं")
finally:
print("एक प्रयास पूर्ण हुआ")
| अपवाद | कारण | उदाहरण |
|---|---|---|
ZeroDivisionError |
शून्य से विभाजन | 10 / 0 |
ValueError |
सही प्रकार, गलत मान | int("abc") |
TypeError |
अनुपयुक्त प्रकार | "5" + 5 |
IndexError |
अनुपलब्ध अनुक्रमांक | list[10] |
KeyError |
अनुपलब्ध कुंजी | dict["xyz"] |
FileNotFoundError |
फाइल का अस्तित्व न होना | open("nofile.txt") |
| घटक | उपयोग | कब चलता है |
|---|---|---|
try |
संदिग्ध कोड | हमेशा |
except |
अपवाद संभालना | केवल अपवाद आने पर |
else |
सफलता का कोड | कोई अपवाद न होने पर |
finally |
सफाई कार्य | हमेशा, अंत में |
except ब्लॉक को खाली छोड़ना: बिना किसी संदेश के केवल except: लिखने से सभी त्रुटियाँ दब जाती हैं और गलती का पता नहीं चलता। सदैव विशिष्ट अपवाद का नाम और उचित संदेश लिखें।else और finally को भ्रमित करना: विद्यार्थी अक्सर मानते हैं कि else हमेशा चलता है, जबकि यह केवल तभी चलता है जब कोई अपवाद नहीं आता।int इनपुट लेकर उसे सीधे भाजक के रूप में उपयोग करना, बिना यह जाँचे कि वह शून्य तो नहीं है।finally में return का उपयोग: finally ब्लॉक में return लिखने से वह फलन के मूल return को प्रभावित करता है, जिससे अप्रत्याशित परिणाम मिलते हैं।Exception) को विशिष्ट अपवाद से पहले लिखना, जिससे विशिष्ट अपवाद कभी नहीं पहुँच पाता।raise का प्रयोग न करना: फलन में अमान्य इनपुट की जाँच न करना और अन्यत्र त्रुटि आने देना, जिससे त्रुटि संदेश अस्पष्ट हो जाता है।try, except, else, finally और raise के क्रम एवं उपयोग को अच्छी तरह याद रखें; इसी से वस्तुनिष्ठ प्रश्न अधिकांशतः पूछे जाते हैं।else केवल सफलता पर चलता है और finally हमेशा चलता है - यह अंतर सबसे अधिक बार परीक्षा में पूछा जाता है।ZeroDivisionError) के साथ as e का उपयोग कर त्रुटि संदेश दिखाने का अभ्यास करें।अपवाद प्रबंधन पाइथन प्रोग्रामिंग की एक अनिवार्य विशेषता है जो प्रोग्राम को मजबूत (robust) और विश्वसनीय बनाती है। try-except-else-finally संरचना की सहायता से हम रनटाइम त्रुटियों को नियंत्रित कर सकते हैं, उपयोगकर्ता को स्पष्ट संदेश दे सकते हैं और प्रोग्राम के प्रवाह को सुरक्षित बनाए रख सकते हैं। raise का उपयोग स्वयं अपवाद उत्पन्न करने के लिए होता है, और मानक अपवाद वर्ग पदानुक्रम को समझकर हम सही अपवाद को सही स्थान पर पकड़ सकते हैं। परीक्षा में अच्छे अंक प्राप्त करने के लिए इन संरचनाओं का लिखित अभ्यास और वस्तुनिष्ठ प्रश्नों का हल अनिवार्य है। एक अच्छा प्रोग्रामर वही है जो न केवल सही कोड लिखे, बल्कि संभावित असफलताओं के लिए भी तैयार रहे।