Python-ի միջին մակարդակ

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

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 կլասի ենթակլաս է, որն ինքնին ժառանգում է BaseException-ից:

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

Բազմաթիվ except հայտարարություններ օգտագործելիս կարևոր է հարգել Python-ում բացառությունների հիերարխիան: Սա նշանակում է, որ եթե դուք բռնում եք հիմնական բացառությունների կլասը, ինչպիսին է Exception-ը, դուք պետք է ավելի կոնկրետ բացառություններ բռնեք դրանից առաջ: Եթե բազային կլասից հետո գրեք ավելի կոնկրետ կլասի բացառությամբ հայտարարություն, ապա բլոկը չի կատարվի.
try:
    # some code that may raise an exception
except ValueError:
    # handle the ValueError
except Exception:
    # handle any other exception
Այս օրինակում նախ հայտնաբերվում է ValueError բացառությունը: Եթե կոդը raise է անում որևէ այլ բացառություն, որը բխում է Exception-ից, ապա կգործարկվի երկրորդ բացառությամբ բլոկի կոդը: Այնուամենայնիվ, խորհուրդ չի տրվում ուղղակիորեն բռնել 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 կլասը, ուստի այն կբռնի ցանկացած բացառություն, որը 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: 0.2 seconds

Memory limit: 512 MB

Output limit: 1 MB

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