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