Python-ում բոլոր բացառությունները բխում են BaseException կլասից: Սա նշանակում է, որ Python-ի յուրաքանչյուր բացառություն BaseException-ի կամ դրա ենթակլասերից մեկի օբյեկտ է:
BaseException կլասը բացառությունների հիերարխիայի վերին մակարդակի կլասն է: Այն տրամադրում է որոշ ընդհանուր մեթոդներ, որոնք կարող են օգտագործել բոլոր բացառությունները, ինչպիսիք են __str__ և __repr__: Այնուամենայնիվ, դուք չպետք է օգտագործեք BaseException-ը ուղղակիորեն ձեր կոդում, քանի որ այն չափազանց լայն է և կարող է բռնել ցանկացած տեսակի բացառություն: Փոխարենը, դուք պետք է օգտագործեք ավելի կոնկրետ բացառությունների կլասեր, որոնք BaseException-ի ենթակլասեր են: Python-ը տրամադրում է մի շարք ներկառուցված բացառությունների կլասեր, որոնք կարող եք օգտագործել, և կարող եք նաև ստեղծել ձեր սեփական հատուկ բացառության կլասերը.
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 բլոկի կոդը 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 ֆայլերը:
Այնուամենայնիվ, տվյալների մեծ քանակի և դրանց վրա աշխատող բազմաթիվ մարդկանց պատճառով հաճախ տեղի են ունենում որոշ սխալներ.
Երբեմն տվյալների ֆայլը գոյություն չունի:
Երբեմն տվյալների ֆայլը դատարկ է:
Երբեմն տվյալների ֆայլը պարունակում է տվյալներ, որոնք վավեր 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.