Exception Hierarchy (अपवादों का श्रेणीक्रम)

Python में, सभी अपवाद BaseException क्लास से व्युत्पन्न होते हैं। इसका मतलब है कि Python में हर अपवाद BaseException या उसकी किसी सबक्लास का इंस्टेंस होता है।
BaseException क्लास अपवादों के श्रेणीक्रम का सबसे ऊँचा स्तर है। यह कुछ सामान्य मेथड्स उपलब्ध कराती है जिनका उपयोग सभी अपवाद कर सकते हैं, जैसे __str__ और __repr__। लेकिन, आपको अपने कोड में BaseException का सीधा इस्तेमाल नहीं करना चाहिए क्योंकि यह बहुत व्यापक है और किसी भी तरह के अपवाद को पकड़ लेता है। इसकी जगह, आपको ऐसे अपवाद वाली क्लासों का उपयोग करना चाहिए जो BaseException की सबक्लास हों। Python कई बिल्ट-इन अपवाद क्लासें प्रदान करता है, साथ ही आप अपनी खुद की कस्टम अपवाद क्लासें भी बना सकते हैं:
BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── MemoryError
      ├── NameError
      │    └── UnboundLocalError
      ├── OSError
      │    ├── BlockingIOError
      │    ├── ChildProcessError
      │    ├── ConnectionError
      │    │    ├── BrokenPipeError
      │    │    ├── ConnectionAbortedError
      │    │    ├── ConnectionRefusedError
      │    │    └── ConnectionResetError
      │    ├── FileExistsError
      │    ├── FileNotFoundError
      │    ├── InterruptedError
      │    ├── IsADirectoryError
      │    ├── NotADirectoryError
      │    ├── PermissionError
      │    ├── ProcessLookupError
      │    └── TimeoutError
      ├── ReferenceError
      ├── RuntimeError
      │    ├── NotImplementedError
      │    └── RecursionError
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning
The hierarchy of built-in exception classes in Python (from the official Python docs).
इसका मतलब है कि FileNotFoundError, OSError की एक सबक्लास है, जो स्वयं Exception क्लास की सबक्लास है, और Exception अंततः BaseException से विरासत में मिली है।

Respecting the exception hierarchy (अपवादों के श्रेणीक्रम का सम्मान)

जब आप कोड में कई except स्टेटमेंट इस्तेमाल करते हैं, तो Python में अपवादों के श्रेणीक्रम का ध्यान रखना बहुत ज़रूरी है। इसका मतलब है कि यदि आप किसी बेस अपवाद क्लास (जैसे Exception) को पकड़ना चाह रहे हैं, तो उससे पहले अधिक विशिष्ट अपवादों को संभालने वाले ब्लॉक लिखें। यदि आप बेस क्लास के लिए except पहले लिख देते हैं, तो बाद में आने वाले विशिष्ट अपवादों वाले ब्लॉक कभी भी निष्पादित नहीं होंगे:
try:
    # ऐसा कोड जो अपवाद खड़ा कर सकता है
except ValueError:
    # ValueError को संभालें
except Exception:
    # किसी भी अन्य अपवाद को संभालें
उपरोक्त उदाहरण में, सबसे पहले ValueError को पकड़ा जाता है। अगर कोड किसी ऐसे अपवाद को उठाता है जो Exception से व्युत्पन्न है लेकिन ValueError नहीं है, तो दूसरे except ब्लॉक में पहुँचा जाएगा। हालाँकि, Exception को सीधे पकड़ना आमतौर पर अनुशंसित नहीं है, क्योंकि यह बहुत व्यापक है। हमेशा संभव हो सके तो अधिक विशिष्ट अपवादों को ही पकड़ें:
try:
    ...
except TypeError:
    ...
except ValueError:
    ...
except Exception:
    ...
यदि try ब्लॉक में लिखा कोड TypeError या ValueError उठाता है, तो वह संबंधित except ब्लॉक निष्पादित होगा। यदि कोई और अपवाद जो Exception से व्युत्पन्न है, उठता है, तो तीसरे except ब्लॉक पर नियंत्रण जाएगा।
यदि आप बेस अपवाद को पहले except ब्लॉक में रखते हैं, तो यह बाकी ब्लॉक्स को हमेशा के लिए निष्क्रिय कर देगा:
try:
    # ऐसा कोड जो अपवाद खड़ा कर सकता है
except Exception as e:               # यह सभी अपवादों को पकड़ लेगा
    print(f'An error occurred: {e}')
except ValueError:                   # यह कभी निष्पादित नहीं होगा
    print('A ValueError occurred')
except TypeError:                    # यह कभी निष्पादित नहीं होगा
    print('A TypeError occurred')
इस उदाहरण में, try ब्लॉक कोई भी अपवाद पैदा कर सकता है, लेकिन पहला except कथन बेस क्लास Exception को संभालता है, इसलिए जो भी अपवाद आएगा उसी में फँस जाएगा। उसके बाद त्रुटि संदेश प्रिंट होता है और बाकी except स्टेटमेंट्स निष्पादित नहीं हो पाते।

Challenge: Parse the File (फ़ाइल को पार्स करें)

आप एक स्टार्टअप में सॉफ्टवेयर इंजीनियर के रूप में काम कर रहे हैं, जहाँ बहुत बड़े पैमाने पर डेटा का इस्तेमाल हो रहा है। हाल ही में, टीम ने तय किया है कि ये डेटा JSON फाइलों में स्टोर और प्रोसेस किया जाएगा। यह डेटा आपके स्टार्टअप के लिए बहुत ज़रूरी है, और आपका काम है एक ऐसा Python प्रोग्राम लिखना जो इन JSON फाइलों को पढ़े और पार्स करे।
लेकिन, डेटा की मात्रा ज़्यादा होने और कई लोग उस पर काम करने की वजह से कुछ समस्याएँ अक्सर सामने आती हैं:
  1. कभी-कभी डेटा फ़ाइल होती ही नहीं (मौजूद नहीं होती)।
  1. कभी-कभी फ़ाइल खाली होती है।
  1. कभी-कभी फ़ाइल में ऐसा डेटा होता है जो मान्य JSON नहीं है।
आपको यह सुनिश्चित करना है कि आपका प्रोग्राम इन अपवादों को सँभाल सके, बिना क्रैश हुए, और उपयुक्त त्रुटि संदेश दे, ताकि डेटा टीम को समस्या को जल्द से जल्द समझने और सुधारने में आसानी हो।
आपका प्रोग्राम एक स्ट्रिंग इनपुट लेगा, जो फ़ाइल का नाम दर्शाती है, और इन स्थितियों को संभालना चाहिए:
  • यदि फ़ाइल मौजूद ही नहीं है, तो FileNotFoundError उठाकर उपयुक्त त्रुटि संदेश प्रिंट करें।
  • यदि फ़ाइल खाली है, तो ValueError उठाकर उपयुक्त त्रुटि संदेश प्रिंट करें।
  • यदि फ़ाइल का कंटेंट मान्य JSON नहीं है, तो json.JSONDecodeError (जो ValueError की सबक्लास है) उठाएँ और उपयुक्त त्रुटि संदेश प्रिंट करें। इस अपवाद को उठाते समय, आपको doc और pos एट्रिब्यूट्स पैरामीटर के रूप में देने चाहिए।
💡
except json.JSONDecodeError as e:
इनमें से प्रत्येक अपवाद को स्वतंत्र रूप से हैंडल करें, और हर स्थिति के लिए एक सटीक त्रुटि संदेश दें।
इनपुट
आउटपुट
nonexistent_file.json
FileNotFoundError: File 'nonexistent_file.json' does not exist.
empty_file.json
ValueError: File 'empty_file.json' is empty.
invalid_json.json
JSONDecodeError: Content of file 'invalid_json.json' is not valid JSON.: line 1 column 1 (char 0)
success.json
File 'success.json' has been successfully parsed as valid JSON.
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue