🔬
🧬
🔭
🪐
🧪
← डैशबोर्ड पर वापस जाएँ
Font Size:

1. परिचय

कंप्यूटर प्रोग्राम चलाते समय कई बार ऐसी स्थितियाँ उत्पन्न होती हैं जो प्रोग्राम के सामान्य निष्पादन को बाधित कर देती हैं। जैसे किसी फाइल को पढ़ने का प्रयास करना जो मौजूद ही नहीं है, या किसी संख्या को शून्य से विभाजित करना। प्रोग्रामिंग की भाषा में ऐसी अप्रत्याशित घटनाओं को अपवाद (Exception) कहा जाता है। अपवाद प्रबंधन (Exception Handling) एक ऐसी तकनीक है जिसके द्वारा हम प्रोग्राम को दुर्घटनाग्रस्त (crash) होने से बचाते हैं और उसे वैकल्पिक रूप से आगे बढ़ने की सुविधा प्रदान करते हैं। पाइथन (Python) में अपवादों को संभालने के लिए try, except, else, finally और raise जैसे कीवर्ड का उपयोग किया जाता है। अपवाद प्रबंधन का मुख्य लाभ यह है कि प्रोग्राम अचानक रुकने के बजाय उपयोगकर्ता को स्पष्ट संदेश देकर सुरक्षित रूप से समाप्त होता है या सही प्रवाह में आगे बढ़ता है।

यदि कोई अपवाद नहीं पकड़ा जाता है, तो इंटरप्रेटर एक एरर ट्रेसबैक (traceback) प्रदर्शित करता है और प्रोग्राम का निष्पादन रुक जाता है। उदाहरण के लिए, नीचे दिया गया कोड एक ZeroDivisionError उत्पन्न करेगा:

num = 10
den = 0
result = num / den   # ZeroDivisionError
print(result)

2. त्रुटि और अपवाद में अंतर (Error vs Exception)

पाइथन में त्रुटि (Error) और अपवाद (Exception) को भिन्न अवधारणाओं के रूप में समझना आवश्यक है। सिंटैक्स एरर (Syntax Error) उस समय उत्पन्न होता है जब हमने पाइथन के व्याकरण नियमों का उल्लंघन किया होता है, जैसे कोष्ठक (bracket) को बंद न करना या इंडेंटेशन (indentation) की गलती करना। ऐसी त्रुटियाँ कोड के लिखे जाने के समय ही पकड़ ली जाती हैं और प्रोग्राम बिल्कुल नहीं चलता। इसके विपरीत, अपवाद (Exception) वे त्रुटियाँ हैं जो प्रोग्राम के निष्पादन (runtime) के दौरान उत्पन्न होती हैं, जैसे NameError, TypeError, ValueError, IndexError आदि। अपवादों को try-except ब्लॉक की सहायता से पकड़ा और प्रबंधित किया जा सकता है, जबकि सिंटैक्स एरर को प्रोग्राम के स्तर पर नहीं पकड़ा जा सकता।

पाइथन के कुछ सामान्य अपवाद:

3. अपवाद प्रबंधन की संरचना (try, except, else, finally)

पाइथन में अपवाद प्रबंधन try और except ब्लॉक की सहायता से किया जाता है। जिस कोड में अपवाद आने की संभावना होती है उसे try ब्लॉक के अंदर लिखा जाता है, और अपवाद उत्पन्न होने पर उसे संभालने का कोड except ब्लॉक में लिखा जाता है। इसका मूल सिंटैक्स इस प्रकार है:

try:
    # संदिग्ध कोड जिसमें अपवाद आ सकता है
    result = 10 / 0
except:
    # अपवाद उत्पन्न होने पर चलने वाला कोड
    print("शून्य से विभाजन संभव नहीं है")

3.1 विशिष्ट अपवाद को पकड़ना

बेहतर अभ्यास यह है कि हम सामान्य रूप से सभी अपवादों को पकड़ने के बजाय विशिष्ट अपवाद को पकड़ें। उदाहरण के लिए:

try:
    num = int(input("एक संख्या दर्ज करें: "))
    print(100 / num)
except ValueError:
    print("कृपया केवल संख्या दर्ज करें")
except ZeroDivisionError:
    print("शून्य से विभाजन संभव नहीं है")

3.2 एक साथ एकाधिक अपवाद पकड़ना

पाइथन में हम एक ही except स्टेटमेंट में टपल (tuple) के माध्यम से कई अपवादों को भी पकड़ सकते हैं:

try:
    value = int(input("संख्या दर्ज करें: "))
    print(100 // value)
except (ValueError, ZeroDivisionError) as e:
    print("त्रुटि उत्पन्न हुई:", e)

3.3 else क्लॉज

else क्लॉज तभी निष्पादित होता है जब try ब्लॉक में कोई अपवाद नहीं आता है। यह कोड को अलग रखने में सहायक होता है:

try:
    num = int(input("संख्या दर्ज करें: "))
except ValueError:
    print("अमान्य इनपुट!")
else:
    print("आपने दर्ज किया:", num)
    print("कोई अपवाद नहीं आया")

3.4 finally क्लॉज

finally ब्लॉक हमेशा निष्पादित होता है, चाहे अपवाद आए या न आए। इसका उपयोग मुख्य रूप से संसाधनों को मुक्त करने के लिए किया जाता है, जैसे फाइल को बंद करना या डेटाबेस कनेक्शन समाप्त करना:

try:
    f = open("data.txt", "r")
    print(f.read())
except FileNotFoundError:
    print("फाइल नहीं मिली")
finally:
    print("यह हमेशा चलेगा")
    f.close()

4. अपवाद को उठाना (raise)

कभी-कभी प्रोग्रामर स्वयं चाहता है कि किसी विशेष स्थिति में एक अपवाद उत्पन्न किया जाए। इसके लिए raise स्टेटमेंट का उपयोग किया जाता है। यह विशेष रूप से तब उपयोगी होता है जब हम फलन के अंदर अमान्य इनपुट की जाँच करना चाहते हैं:

def check_age(age):
    if age < 0:
        raise ValueError("आयु ऋणात्मक नहीं हो सकती")
    print("आयु स्वीकार्य है")

check_age(-5)

5. मानक अपवाद और उनकी श्रेणियाँ (Hierarchy)

पाइथन में सभी अपवादों की जड़ 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 के बीच होने चाहिए")

6. अपवाद प्रबंधन के लाभ

अपवाद प्रबंधन का उपयोग करने के अनेक लाभ हैं। सबसे पहले, यह प्रोग्राम को क्रैश होने से बचाता है और उपयोगकर्ता को सार्थक त्रुटि संदेश देता है। दूसरे, यह त्रुटि-संभावित कोड को सामान्य कोड से अलग करता है, जिससे कोड अधिक पठनीय बनता है। तीसरे, finally ब्लॉक के माध्यम से यह सुनिश्चित करता है कि महत्वपूर्ण सफाई कार्य हमेशा संपन्न हों। अंत में, एक प्रोग्राम में एक से अधिक except ब्लॉक लिखकर हम विभिन्न प्रकार की त्रुटियों के लिए अलग-अलग प्रतिक्रियाएँ निर्धारित कर सकते हैं।

7. व्यावहारिक उदाहरण

मान लीजिए हमें एक प्रोग्राम लिखना है जो दो संख्याओं को विभाजित करे और संभावित सभी त्रुटियों को संभाले:

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 संरचना के घटक

घटक उपयोग कब चलता है
try संदिग्ध कोड हमेशा
except अपवाद संभालना केवल अपवाद आने पर
else सफलता का कोड कोई अपवाद न होने पर
finally सफाई कार्य हमेशा, अंत में

माइंड मैप

flowchart TD A["अपवाद प्रबंधन"] --> B["अपवाद के प्रकार"] A --> C["कीवर्ड"] A --> D["मानक अपवाद"] A --> E["लाभ"] B --> B1["सिंटैक्स एरर"] B --> B2["रनटाइम अपवाद"] C --> C1["try"] C --> C2["except"] C --> C3["else"] C --> C4["finally"] C --> C5["raise"] D --> D1["ValueError"] D --> D2["TypeError"] D --> D3["ZeroDivisionError"] E --> E1["प्रोग्राम नहीं रुकता"] E --> E2["स्पष्ट संदेश"]

महत्वपूर्ण आरेख (SVG)

आरेख 1: अपवाद प्रबंधन का प्रवाह

try ब्लॉक प्रारंभ संदिग्ध कोड का निष्पादन except ब्लॉक else ब्लॉक (सफलता) finally ब्लॉक प्रोग्राम निरंतर स्वर्ण नियम: finally हमेशा चलता है

आरेख 2: अपवाद वर्ग पदानुक्रम

BaseException Exception ArithmeticError LookupError ValueError ZeroDivisionError IndexError, KeyError TypeError भिन्न श्रेणी स्वर्ण नियम: सदैव सबसे विशिष्ट अपवाद पकड़ें

सामान्य गलतियाँ

  1. except ब्लॉक को खाली छोड़ना: बिना किसी संदेश के केवल except: लिखने से सभी त्रुटियाँ दब जाती हैं और गलती का पता नहीं चलता। सदैव विशिष्ट अपवाद का नाम और उचित संदेश लिखें।
  2. else और finally को भ्रमित करना: विद्यार्थी अक्सर मानते हैं कि else हमेशा चलता है, जबकि यह केवल तभी चलता है जब कोई अपवाद नहीं आता।
  3. शून्य से विभाजन का परीक्षण न करना: int इनपुट लेकर उसे सीधे भाजक के रूप में उपयोग करना, बिना यह जाँचे कि वह शून्य तो नहीं है।
  4. finally में return का उपयोग: finally ब्लॉक में return लिखने से वह फलन के मूल return को प्रभावित करता है, जिससे अप्रत्याशित परिणाम मिलते हैं।
  5. अपवाद का गलत क्रम: सामान्य अपवाद (जैसे Exception) को विशिष्ट अपवाद से पहले लिखना, जिससे विशिष्ट अपवाद कभी नहीं पहुँच पाता।
  6. raise का प्रयोग न करना: फलन में अमान्य इनपुट की जाँच न करना और अन्यत्र त्रुटि आने देना, जिससे त्रुटि संदेश अस्पष्ट हो जाता है।

परीक्षा युक्तियाँ

  1. try, except, else, finally और raise के क्रम एवं उपयोग को अच्छी तरह याद रखें; इसी से वस्तुनिष्ठ प्रश्न अधिकांशतः पूछे जाते हैं।
  2. प्रश्न में दिया गया कोड ध्यान से पढ़कर पहले पहचानें कि कौन सा अपवाद उत्पन्न होगा, फिर उत्तर चुनें।
  3. else केवल सफलता पर चलता है और finally हमेशा चलता है - यह अंतर सबसे अधिक बार परीक्षा में पूछा जाता है।
  4. कोड लिखते समय विशिष्ट अपवाद नाम (जैसे ZeroDivisionError) के साथ as e का उपयोग कर त्रुटि संदेश दिखाने का अभ्यास करें।
  5. अभ्यास के लिए अलग-अलग स्थितियों के मिश्रित प्रोग्राम बनाएं जिनमें एक साथ कई प्रकार के अपवाद आ सकते हैं।

निष्कर्ष

अपवाद प्रबंधन पाइथन प्रोग्रामिंग की एक अनिवार्य विशेषता है जो प्रोग्राम को मजबूत (robust) और विश्वसनीय बनाती है। try-except-else-finally संरचना की सहायता से हम रनटाइम त्रुटियों को नियंत्रित कर सकते हैं, उपयोगकर्ता को स्पष्ट संदेश दे सकते हैं और प्रोग्राम के प्रवाह को सुरक्षित बनाए रख सकते हैं। raise का उपयोग स्वयं अपवाद उत्पन्न करने के लिए होता है, और मानक अपवाद वर्ग पदानुक्रम को समझकर हम सही अपवाद को सही स्थान पर पकड़ सकते हैं। परीक्षा में अच्छे अंक प्राप्त करने के लिए इन संरचनाओं का लिखित अभ्यास और वस्तुनिष्ठ प्रश्नों का हल अनिवार्य है। एक अच्छा प्रोग्रामर वही है जो न केवल सही कोड लिखे, बल्कि संभावित असफलताओं के लिए भी तैयार रहे।