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

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. Երբեմն տվյալների ֆայլը գոյություն չունի:

  2. Երբեմն տվյալների ֆայլը դատարկ է:

  3. Երբեմն տվյալների ֆայլը պարունակում է տվյալներ, որոնք վավեր JSON չեն:

Դուք պետք է համոզվեք, որ ձեր Python ծրագիրը կարող է առանց խափանումների կարգավորել այս բացառությունները և սխալի վերաբերյալ տրամադրել հաղորդագրություններ, որպեսզի տվյալների հետ աշխատող թիմը կարողանա արագ բացահայտել և շտկել խնդիրը:

Ծրագիրը մուտքում պետք է ընդունի մի տող՝ ֆայլի անունը, և կարգավորի հետևյալ դեպքերը.

  • Եթե ֆայլը գոյություն չունի, այն պետք է raise անի FileNotFoundError և տպի համապատասխան սխալի հաղորդագրություն:

  • Եթե ֆայլը դատարկ է, այն պետք է raise անի ValueError և տպի համապատասխան սխալի հաղորդագրություն:

  • Եթե ֆայլի բովանդակությունը վավեր JSON չէ, այն պետք է raise անի json.JSONDecodeError (որը ValueError-ի ենթադաս է) և տպի համապատասխան սխալի հաղորդագրություն: Բացառությունը raise անելիս դուք պետք է փոխանցեք doc և 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