Ինչպես ստեղծել անհատական բացառություններ Python-ում


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

Python-ի ներկառուցված բացառությունների դասերը չեն անդրադառնում որոշակի սխալի իրավիճակներին, որոնք կարող են առաջանալ ձեր կոդում: Նման դեպքերում դուք պետք է ստեղծեք հատուկ բացառություններ՝ այս սխալներն արդյունավետ կարգավորելու համար:

Python-ում դուք կարող եք սահմանել հատուկ բացառություններ և բարձրացնել դրանք, երբ առաջանում են հատուկ սխալ իրավիճակներ: Դուք կարող եք կառավարել հատուկ, տեղեկատվական սխալները՝ հատուկ բացառություններով, բարելավելով ձեր կոդի ընթեռնելիությունը և պահպանելիությունը:

Ինչու՞ են ձեզ հարկավոր հատուկ բացառություններ:

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

Python-ն առաջարկում է մի շարք ներկառուցված բացառությունների դասեր, որոնք ծածկում են այնպիսի սխալներ, ինչպիսիք են ValueError, TypeError, FileNotFoundError և այլն: Թեև այս ներկառուցված բացառությունները լավ են ծառայում իրենց նպատակին, դրանք կարող են միայն երբեմն ճշգրիտ ներկայացնել սխալները, որոնք կարող են առաջանալ ձեր հավելվածում:

Ստեղծելով հատուկ բացառություններ՝ դուք կարող եք դրանք հատուկ հարմարեցնել ձեր հավելվածի պահանջներին համապատասխան և տեղեկատվություն տրամադրել մշակողների համար, ովքեր օգտագործում են ձեր կոդը:

Ինչպես սահմանել մաքսային բացառությունները

Հատուկ բացառություններ ստեղծելու համար սահմանեք Python դաս, որը ժառանգում է Exception դասից: Բացառություն դասը առաջարկում է հիմնական գործառույթներ, որոնք ձեզ անհրաժեշտ կլինեն բացառությունները կարգավորելու համար, և դուք կարող եք հարմարեցնել այն՝ ձեր հատուկ կարիքների հիման վրա գործառույթներ ավելացնելու համար:

Հատուկ բացառությունների դասեր ստեղծելիս դրանք պարզ պահեք՝ միաժամանակ ներառելով սխալի մասին տեղեկությունները պահելու համար անհրաժեշտ ատրիբուտները: Այնուհետև բացառությունների մշակողները կարող են մուտք գործել այս ատրիբուտները՝ սխալները պատշաճ կերպով կարգավորելու համար:

Ահա սովորական բացառությունների դասը՝ MyCustomError:

class MyCustomError(Exception):
    def __init__(self, message=None):
        self.message = message
        super().__init__(message)

Այս դասը սկզբնավորման ընթացքում ընդունում է կամընտիր հաղորդագրության արգումենտ: Այն օգտագործում է super() մեթոդը` կանչելու Exception բազային դասի կոնստրուկտորը, որը կարևոր է բացառությունների մշակման համար:

Ինչպես բարձրացնել մաքսային բացառությունները

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

if True:
    raise MyCustomError("A Custom Error Was Raised!!!.")

Դուք կարող եք նաև բարձրացնել սխալը՝ առանց որևէ արգումենտ փոխանցելու.

if True:
    raise MyCustomError # shorthand

Ցանկացած ձևաչափ հարմար է մաքսային սխալների բարձրացման համար:

Ինչպես կարգավորել մաքսային բացառությունները

Պատվերով բացառությունների հետ աշխատելը հետևում է նույն մոտեցումին, ինչ ներկառուցված բացառությունները: Օգտագործեք փորձել, բացառությամբ և վերջապես բլոկները՝ հատուկ բացառությունները բռնելու և համապատասխան գործողություններ կատարելու համար:

try:
    print("Hello, You're learning how to MakeUseOf Custom Errors")
    raise MyCustomError("Opps, Something Went Wrong!!!.")
except MyCustomError as err:
    print(f"Error: {err}")
finally:
    print("Done Handling Custom Error")

Այսպիսով, դուք կարող եք կարգավորել բարձրացված մաքսային բացառությունների բոլոր ձևերը:

Եթե փորձել բլոկի կատարման ժամանակ բացառություն է առաջանում, ապա համապատասխան բացառությամբ բլոկը կարող է բռնել և մշակել այն: Եթե չկա համապատասխան բացառությամբ բլոկ՝ բացառությունը կարգավորելու համար, ցանկացած վերջապես բլոկ կգործարկվի, որից հետո բացառությունը նորից կբարձրանա: Օգտագործեք վերջապես բլոկը հիմնականում մաքրման առաջադրանքները կատարելու համար, որոնք պետք է կատարվեն ցանկացած հանգամանքներում, անկախ նրանից՝ բացառություն է տեղի ունենում, թե ոչ:

try:
    raise KeyboardInterrupt
except MyCustomError as err:
    print(f"Error: {err}")
finally:
    print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")

Այս նմուշում տեղի է ունենում KeyboardInterrupt բացառություն, սակայն բացառությամբ բլոկը կարգավորում է միայն MyCustomError բացառությունները: Այս դեպքում, վերջապես բլոկը գործարկվում է, ապա չկառավարվող բացառությունը կրկին բարձրանում է:

Պատվերով սխալների դասերի ժառանգում

Հիմնվելով Օբյեկտ-կողմնորոշված ծրագրավորման (OOP) հայեցակարգի վրա, դուք կարող եք նաև ժառանգել սովորական բացառությունների դասերից, ինչպես սովորական դասերը: Ժառանգելով սովորական բացառությունների դասից՝ դուք կարող եք ստեղծել սխալների դասեր, որոնք ավելի կոնկրետ ենթատեքստ են տրամադրում բացառությանը: Այս մոտեցումը թույլ է տալիս կարգավորել ձեր կոդի տարբեր մակարդակների սխալները և ավելի լավ հասկանալ, թե ինչն է առաջացրել սխալը:

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

class BaseAPIException(Exception):
    """Base class for API-related exceptions."""
    def __init__(self, message):
        super().__init__(message)
        self.message = message

Այս բազային հատուկ բացառությունների դասը ունենալուց հետո կարող եք ստեղծել երեխայի բացառության դասեր, որոնք ժառանգում են դրանից.

class APINotFoundError(BaseAPIException):
    """Raised when the requested resource is not found in the API."""
    pass
class APIAuthenticationError(BaseAPIException):
    """Raised when there's an issue with authentication to the API."""
    pass
class APIRateLimitExceeded(BaseAPIException):
    """Raised when the rate limit for API requests is exceeded."""
    pass

Բարձրացրեք և բռնեք այս հատուկ բացառությունները ձեր վեբ հավելվածում API-ին զանգեր կատարելիս: Կառավարեք դրանք համապատասխանաբար՝ օգտագործելով ձեր կոդի համապատասխան տրամաբանությունը:

def request_api():
    try:
        # Simulate an API error for demonstration purposes
        raise APINotFoundError("Requested resource not found.")
    except APINotFoundError as err:
        # Log or handle the 'Not Found' error case
        print(f"API Not Found Error: {err}")
    except APIAuthenticationError:
        # Take appropriate actions for authentication error
        print(f"API Authentication Error: {err}")
    except APIRateLimitExceeded:
        # Handle the rate limit exceeded scenario
        print(f"API Rate Limit Exceeded: {err}")
    except BaseAPIException:
        # Handle other unknown API exceptions
        print(f"Unknown API Exception: {err}")

Եզրափակիչ դրույթը ստուգում է ծնող դասի դեմ և գործում է որպես բոլորը API-ի հետ կապված այլ սխալների համար:

Երբ դուք ժառանգում եք հատուկ բացառության դասեր, դուք կարող եք արդյունավետորեն կարգավորել սխալները API-ի ներսում: Այս մոտեցումը թույլ է տալիս տարանջատել ձեր սխալների կառավարումը API-ի իրականացման մանրամասներից՝ հեշտացնելով հատուկ բացառություններ ավելացնելը կամ փոփոխություններ կատարելը, երբ API-ն զարգանում է կամ հանդիպում է նոր սխալների դեպքերի:

Փաթաթում Պատվերով Բացառություններ

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

Հաշվի առեք այն սցենարը, որտեղ ձեր վեբ հավելվածը փոխազդում է API-ի հետ: Եթե API-ն բարձրացնում է LookupError, դուք կարող եք բռնել այն, ապա բարձրացրեք հատուկ APINotFoundError բացառություն, որը հղում է կատարում LookupError-ին որպես դրա պատճառ:

def request_api():
    try:
        # Simulate an API error for demonstration purposes
        # Assuming the external API raised a LookupError
        raise LookupError("Sorry, You Encountered A LookUpError !!!")
    except LookupError as original_exception:
        try:
            # Wrap the original exception with a custom exception
            raise APINotFoundError \
                 ("Requested resource not found.") from original_exception
        except APINotFoundError as wrapped_exception:
            # Handle the wrapped exception here 
            print(f"Caught wrapped API exception: {wrapped_exception}")
            # or re-raise it if necessary
            raise
try:
    request_api()
except APINotFoundError as err:
    print(f"Caught API exception: {err.__cause__}")

Օգտագործեք -ից կետ՝ բարձրացնել հայտարարությամբ՝ ձեր հատուկ բացառության մեջ սկզբնական բացառությանը հղում կատարելու համար:

Երբ տեղի է ունենում հատուկ բացառություն, այն ներառում է սկզբնական բացառությունը որպես __cause__ հատկանիշ՝ կապ ապահովելով հատուկ բացառության և բնօրինակի միջև: Սա թույլ է տալիս հետևել բացառության ծագմանը:

Բացառությունները փաթաթելով՝ դուք կարող եք ապահովել ավելի բովանդակալից համատեքստ և օգտատերերին ուղարկել ավելի համապատասխան սխալի հաղորդագրություններ՝ չբացահայտելով ձեր կոդի կամ API-ի ներքին կատարման մանրամասները: Այն նաև թույլ է տալիս համակարգված և միատեսակ կերպով կառավարել և հասցեագրել սխալների տեսակները:

Դասի վարքագծի հարմարեցում Python-ում

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