A kivételek hatékony és kecses módot jelentenek a Python-programok hibáinak kezelésére. Az egyéni kivételek ezt a képességet új szintre emelik.
A Python beépített kivételosztályai nem kezelnek bizonyos hibahelyzeteket, amelyek a kódban előfordulhatnak. Ilyen esetekben egyéni kivételeket kell létrehoznia a hibák hatékony kezeléséhez.
A Pythonban egyéni kivételeket definiálhat, és adott hibahelyzetek esetén előállíthatja azokat. Egyéni kivételekkel kezelheti a konkrét, informatív hibákat, javítva ezzel a kód olvashatóságát és karbantarthatóságát.
Miért van szükség egyedi kivételekre?
Egy alkalmazás fejlesztése során különféle hibaforgatókönyvek léphetnek fel a kód változásai, más csomagokkal vagy könyvtárakkal való integráció, valamint a külső alkalmazásokkal való interakciók miatt. Kulcsfontosságú ezeknek a hibáknak a kezelése, hogy helyreálljon belőlük, vagy kecsesen kezelje a hibákat.
A Python számos lehetőséget kínál beépített kivétel osztályok, amelyek olyan hibákat takarnak, mint pl ValueError
, TypeError, FileNotFoundError, és több. Noha ezek a beépített kivételek jól szolgálják céljukat, előfordulhat, hogy csak néha tükrözik pontosan az alkalmazásban előforduló hibákat.Egyéni kivételek létrehozásával azokat kifejezetten az alkalmazás követelményeihez igazíthatja, és információkat nyújthat a kódját használó fejlesztők számára.
Egyéni kivételek meghatározása
Egyéni kivételek létrehozásához definiáljon egy Python osztályt hogy örököl a Kivétel osztály. A Kivétel osztály olyan alapfunkciókat kínál, amelyekre szüksége lesz a kivételek kezelésére, és testreszabhatja, hogy sajátos igényei szerint adjon hozzá funkciókat.
Egyéni kivételosztályok létrehozásakor ügyeljen arra, hogy azok egyszerűek legyenek, miközben tartalmazzák a hibainformációk tárolásához szükséges attribútumokat. A kivételkezelők ezután hozzáférhetnek ezekhez az attribútumokhoz, hogy megfelelően kezeljék a hibákat.
Íme egy egyéni kivételosztály, MyCustomError:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Ez az osztály elfogad egy opcionális üzenet argumentumot az inicializálás során. Használja a szuper() módszer az alap konstruktorának meghívására Kivétel osztály, ami elengedhetetlen a kivételkezeléshez.
Hogyan emeljünk egyéni kivételeket
Hiba felhozásához használja a emel kulcsszót követi az egyéni kivételosztály egy példánya, és hibaüzenetet ad át neki argumentumként:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
A hibát argumentumok átadása nélkül is felveheti:
ifTrue:
raise MyCustomError # shorthand
Bármelyik formátum alkalmas egyéni hibák felvetésére.
Hogyan kezeljük az egyéni kivételeket
Az egyéni kivételek kezelése ugyanazt a megközelítést követi, mint a beépített kivételek kezelése. Használat próbáld ki, kivéve, és végül blokkolja az egyéni kivételeket, és megteszi a megfelelő lépéseket.
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")
Így kezelheti a felmerült egyéni kivételek minden formáját.
Ha kivétel történik a végrehajtása során próbáld ki blokk, egy megfelelő kivéve blokk el tudja fogni és kezelni tudja. Ha nincs megfelelő kivéve blokk a kivétel kezelésére, bármilyen végül blokk végrehajtásra kerül, majd ismét a kivétel emelése következik. Használj végül blokkolja elsősorban olyan tisztítási feladatok elvégzésére, amelyeknek minden körülmények között le kell futniuk, függetlenül attól, hogy előfordul-e kivétel vagy sem.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
Ebben a mintában a Keyboard Interrupt kivétel előfordul, de a kivéve blokk csak fogantyúk MyCustomError kivételek. Ebben az esetben a végül blokk fut, majd a kezeletlen kivétel ismét felemel.
Egyéni hibaosztályok öröklése
Alapján az objektum-orientált programozás fogalma (OOP), örökölhet egyéni kivételosztályokból, akárcsak a normál osztályokból. Egyéni kivételosztályból való örökléssel hibaosztályokat hozhat létre, amelyek konkrétabb kontextust biztosítanak a kivételekhez. Ez a megközelítés lehetővé teszi, hogy a kód különböző szintjein kezelje a hibákat, és jobban megértse, mi okozta a hibát.
Tegyük fel, hogy olyan webalkalmazást fejleszt, amely kölcsönhatásba lép egy külső API-val. Ennek az API-nak különböző hibaforgatókönyvei lehetnek. Ezeket a hibákat a kód során következetesen és egyértelműen kell kezelnie. Ennek eléréséhez hozzon létre egy egyéni kivételosztályt, BaseAPI kivétel:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Ha megvan ez az alap egyéni kivételosztály, létrehozhat gyermek kivételosztályokat, amelyek örökölnek belőle:
classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
passclassAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass
classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass
Emelje fel és fogadja el ezeket az egyéni kivételeket, amikor az API-t hívja a webalkalmazáson belül. Ennek megfelelően kezelje őket a kód megfelelő logikájával.
defrequest_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}")
Az utolsó kivételes záradék a szülőosztályt ellenőrzi, és összesítőként működik minden egyéb API-val kapcsolatos hiba esetén.
Ha egyéni kivételosztályokat örököl, hatékonyan kezelheti az API-n belüli hibákat. Ez a megközelítés lehetővé teszi, hogy elkülönítse a hibakezelést az API megvalósítási részleteitől, megkönnyíti az egyéni kivételek hozzáadását vagy módosításait, amikor az API fejlődik vagy új hibákkal találkozik esetek.
Egyéni kivételek becsomagolása
A kivételek tördelése azt jelenti, hogy rögzíteni kell egy kivételt, beágyazni egy egyéni kivételbe, majd fel kell emelni az egyéni kivételt, miközben az eredeti kivételre hivatkozik annak okaként. Ez a technika segít kontextust biztosítani a hibaüzeneteknek, és rejtve tartja a megvalósítás részleteit a hívó kód elől.
Fontolja meg azt a forgatókönyvet, amikor a webalkalmazás kölcsönhatásba lép egy API-val. Ha az API felveti a LookupError, elkaphatod, majd emelj egy szokást APINotFoundError kivétel, amely a LookupError-ra hivatkozik okaként:
defrequest_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__}")
Használj tól től záradék a emel utasítással hivatkozhat az eredeti kivételre az egyéni kivételen belül.
Amikor az egyéni kivétel előfordul, az eredeti kivételt tartalmazza a __ok__ attribútum, amely kapcsolatot biztosít az egyéni kivétel és az eredeti között. Ez lehetővé teszi a kivétel eredetének nyomon követését.
A kivételek tördelésével értelmesebb kontextust biztosíthat, és megfelelőbb hibaüzeneteket küldhet a felhasználóknak anélkül, hogy felfedné a kód vagy az API belső megvalósítási részleteit. Ezenkívül lehetővé teszi a hibatípusok strukturált és egységes kezelését és kezelését.
Az osztályviselkedés testreszabása Pythonban
A Python által biztosított alapkivétel-osztály öröklésével egyszerű és hasznos kivételeket hozhat létre, amelyeket akkor vethet fel, ha a kódban bizonyos hibák fordulnak elő. Magic vagy dunder metódusok segítségével egyéni viselkedést is megvalósíthat kivételosztályaihoz.