Բացառությունների հիերարխիա

Python-ում բոլոր բացառությունները բխում են BaseException class-ից: Սա նշանակում է, որ Python-ի յուրաքանչյուր բացառություն BaseException-ի կամ դրա ենթադասերից մեկի օբյեկտ է:
BaseException class-ը բացառությունների հիերարխիայի վերին մակարդակի class-ն է: Այն տրամադրում է որոշ ընդհանուր մեթոդներ (օրինակ՝ __str__-ը և __repr__-ը), որոնք կարող են օգտագործել բոլոր բացառությունները։ Սակայն BaseException-ը չպետք է օգտագործեք ուղղակիորեն ձեր կոդում, քանի որ այն չափազանց լայն է և կարող է բռնել ցանկացած տեսակի բացառություն: Փոխարենը, դուք պետք է օգտագործեք ավելի կոնկրետ բացառությունների class-ներ, որոնք BaseException-ի ենթադասեր են: Python-ը տրամադրում է մի շարք ներկառուցված բացառությունների class-ներ: Դուք կարող եք օգտվել դրանցից կամ ստեղծել սեփական հատուկ բացառության class-ները.
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). (Ներկառուցված բացառության class-ների հիերարխիան Python-ում)
Սա նշանակում է, որ FileNotFoundError-ը OSError-ի ենթադաս է, որը Exception class-ի ենթադաս է, որն էլ իր հերթին ժառանգում է BaseException-ից:

Հետևելով բացառությունների հիերարխիային

Բազմաթիվ except հայտարարություններ օգտագործելիս կարևոր է հետևել Python-ում կիրառվող բացառությունների հիերարխիային: Սա նշանակում է, որ եթե դուք բռնում եք հիմնական բացառությունների class-ը (օրինակ՝ Exception-ը), դուք դրանից առաջ պետք է ավելի կոնկրետ բացառություններ բռնեք: Եթե բազային class-ից հետո գրեք ավելի կոնկրետ class-ի except հայտարարություն, ապա բլոկը չի կատարվի.
try:
    # some code that may raise an exception
except ValueError:
    # handle the ValueError
except Exception:
    # handle any other exception
Այս օրինակում նախ հայտնաբերվում է ValueError բացառությունը: Եթե կոդը raise է անում որևէ այլ բացառություն, որը բխում է Exception-ից, ապա կգործարկվի երկրորդ except բլոկի կոդը: Այնուամենայնիվ, խորհուրդ չի տրվում ուղղակիորեն բռնել Exception-ը, քանի որ այն չափազանց լայն է և կարող է բռնել ցանկացած տեսակի բացառություն: Հնարավորության դեպքում նախընտրելի է բռնել ավելի կոնկրետ բացառություններ.
try:
    ...
except TypeError:
    ...
except ValueError:
    ...
except Exception:
    ...
Եթե try բլոկի կոդը raise է անում TypeError կամ ValueError, համապատասխան except բլոկը կգործարկվի: Եթե կոդը raise է անում որևէ այլ բացառություն, որը բխում է Exception-ից, կգործարկվի երրորդ except բլոկի կոդը:
Եթե մենք տեղադրենք բազային բացառությունը որպես առաջին except բլոկ, այն կկանխի մնացածի կատարումը.
try:
    # some code that may raise an exception
except Exception as e:               # This will catch all the errors
    print(f'An error occurred: {e}')
except ValueError:                   # This will never be executed
    print('A ValueError occurred')
except TypeError:                    # This will never be executed
    print('A TypeError occurred')
Այս օրինակում try բլոկը կարող է առաջացնել ցանկացած տեսակի բացառություն: Սակայն առաջին except դրույթը բռնում է բազային Exception class-ը, ուստի այն կբռնի ցանկացած բացառություն, որը raise է արվել: Սխալի հաղորդագրությունը կտպվի, իսկ մնացած except հայտարարությունները չեն կատարվի:

Առաջադրանք․ վերլուծել ֆայլը

Դուք աշխատում եք որպես ծրագրային ապահովման ճարտարագետ մի սկսնակ ընկերությունում, որն աշխատում է հսկայածավալ տվյալների հետ: Վերջերս թիմը որոշեց օգտագործել JSON ֆայլերը տվյալների պահպանման և մշակման համար: Այս տվյալները կենսական նշանակություն ունեն ձեր ընկերության համար, և ձեր խնդիրն է գրել Python ծրագիր, որը կարդում և վերլուծում է տրված JSON ֆայլերը:
Հաշվի առեք, որ խնդիր կա․ տվյալների մեծ քանակի և դրանց հետ աշխատող մարդկանց մեծ թվի պատճառով հաճախ տեղի են ունենում որոշ սխալներ.
  1. Երբեմն տվյալների ֆայլը գոյություն չունի:
  1. Երբեմն տվյալների ֆայլը դատարկ է:
  1. Երբեմն տվյալների ֆայլը պարունակում է տվյալներ, որոնք վավեր JSON չեն:
Դուք պետք է համոզվեք, որ ձեր Python ծրագիրը կարող է առանց խափանումների կարգավորել այս բացառությունները և սխալի վերաբերյալ տրամադրել հաղորդագրություններ, որպեսզի տվյալների հետ աշխատող թիմը կարողանա արագ բացահայտել և շտկել խնդիրը:
Ծրագիրը մուտքում պետք է ընդունի մի տող՝ ֆայլի անունը, և կարգավորի հետևյալ դեպքերը.
  • Եթե ֆայլը գոյություն չունի, այն պետք է raise անի FileNotFoundError և տպի համապատասխան սխալի հաղորդագրություն:
  • Եթե ֆայլը դատարկ է, այն պետք է raise անի ValueError և տպի համապատասխան սխալի հաղորդագրություն:
  • Եթե ֆայլի բովանդակությունը վավեր JSON չէ, այն պետք է raise անի json.JSONDecodeError (որը ValueError-ի ենթադաս է) և տպի համապատասխան սխալի հաղորդագրություն: Բացառությունը raise անելիս դուք պետք է փոխանցեք doc և pos ատրիբուտները որպես պարամետրեր.
💡
except json.JSONDecodeError as e: raise json.JSONDecodeError("some message", e.doc, e.pos)
Այս բացառություններից յուրաքանչյուրը պետք է կարգավորվի առանձին, և ձեր ծրագիրը պետք է տրամադրի սխալի մասին հաղորդագրություն յուրաքանչյուր դեպքի համար:
Մուտք
Ելք
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