Felhasználó által definiált kivételek a Pythonban példákkal
A felhasználó által definiált kivételek egy új osztály meghatározásával jönnek létre, amelyből öröklődik A Python beépített kivétele osztályt vagy annak valamelyik alosztályát. Ezzel egyéni hibaüzeneteket hozhatunk létre, és az adott hibákat úgy kezelhetjük, hogy az alkalmazásunk számára ésszerű.
Felhasználó által meghatározott kivételek létrehozásának és használatának lépései
Kövesse az alábbi lépéseket a felhasználó által meghatározott kivételek létrehozásához és használatához a Pythonban:
- Új kivételosztály meghatározása: Hozzon létre egy új osztályt, amely az Exceptiontől vagy annak bármely alosztályától örököl.
- A kivétel emelése: Használja a raise utasítást a felhasználó által meghatározott kivétel felemeléséhez, ha egy adott feltétel előfordul.
- Kezelje a kivételt: Használja a try-except blokkokat a felhasználó által meghatározott kivételek kezelésére.
Példa: Ebben a példában létrehozunk egy egyéni kivételt InvalidAgeError annak biztosítására, hogy az életkor értékei egy érvényes tartományba esnek (0–120).
Python # Step 1: Define a custom exception class class InvalidAgeError ( Exception ): def __init__ ( self age msg = 'Age must be between 0 and 120' ): self . age = age self . msg = msg super () . __init__ ( self . msg ) def __str__ ( self ): return f ' { self . age } -> { self . msg } ' # Step 2: Use the custom exception in your code def set_age ( age ): if age < 0 or age > 120 : raise InvalidAgeError ( age ) else : print ( f 'Age set to: { age } ' ) # Step 3: Handling the custom exception try : set_age ( 150 ) # This will raise the custom exception except InvalidAgeError as e : print ( e )
Kimenet
150 -> Age must be between 0 and 120
Magyarázat:
- Az InvalidAgeError osztály a kivételtől örökli. Meghatározza egy __forró__ módszer az életkor és az üzenet elfogadására.
- A __str__ metódus a hiba olvasható karakterlánc-ábrázolását adja vissza.
- A set_age() függvényben, ha az életkor kívül esik az érvényes tartományon (0–120), a kivétel emelkedik.
- A try-except blokk elkapja a kivételt, és kiírja a hibaüzenetet.
Kivételes osztályok testreszabása
Amikor egyéni kivételt hozunk létre, alosztályozzuk a Python beépített Exception osztályát (vagy egy olyan alosztályt, mint a ValueError TypeError stb.). Ezután hozzáadhatjuk saját attribútummódszereinket vagy egyéni logikánkat, hogy a kivételünket informatívabbá tegyük.
Az egyéni kivételeket további attribútumok vagy felülbíráló módszerek hozzáadásával is javíthatjuk.
Példa: Itt javítjuk az InvalidAgeError-t egy hibakód hozzáadásával és a hibaüzenet testreszabásával.
Python class InvalidAgeError ( Exception ): def __init__ ( self age msg = 'Age must be between 0 and 120' error_code = 1001 ): self . age = age self . msg = msg self . error_code = error_code super () . __init__ ( self . msg ) def __str__ ( self ): return f '[Error Code { self . error_code } ] { self . age } -> { self . msg } ' try : set_age ( 150 ) # This will raise the custom exception except InvalidAgeError as e : print ( e )
Kimenet
[Error Code 1001] 150 -> Age must be between 0 and 120
Magyarázat:
- Az InvalidAgeError mostantól egy további hibakód attribútumot is tartalmaz.
- A __str__ metódus felül van írva a hibakód és az életkor megjelenítéséhez.
- Amikor a set_age(150) végrehajtódik, a kivétel felemelkedik, és a try-except blokkba kerül.
- A testreszabott hibaüzenet kinyomtatásra kerül, így a hiba leíróbbá válik.
Szabványos kivételek használata alaposztályként
Néha a kivételtől való közvetlen öröklés helyett egyéni kivételt hozhatunk létre egy szabványos kivétel alosztályozásával, például RuntimeError ValueError stb. Ez akkor hasznos, ha az egyéni kivételt egy bizonyos típusú hibaként kell kezelni.
Példa: Ez a példa bemutatja, hogyan hozhat létre egyedi kivételt NetworkError a RuntimeErrorból, amely egy szabványos beépített kivétel.
Python # NetworkError has base RuntimeError and not Exception class NetworkError ( RuntimeError ): def __init__ ( self arg ): self . args = ( arg ) # store as tuple try : raise NetworkError ( 'Connection failed' ) except NetworkError as e : print ( e . args )
Kimenet
('Connection failed') Magyarázat:
- A NetworkError a RuntimeErrortól örökli, amely egy beépített kivételtípus.
- Amikor felemeljük, az üzenet az args attribútumban egy sorként kerül tárolásra.
- A kivétel elkapásra kerül, és a tárolt argumentumai megjelennek.
Valós példa: Érvénytelen e-mail hiba
Íme egy egyszerű példa, amikor egyéni kivételt állítunk elő, ha az e-mail cím nem érvényes:
Python class InvalidEmailError ( Exception ): def __init__ ( self email msg = 'Invalid email format' ): self . email = email self . msg = msg super () . __init__ ( self . msg ) def __str__ ( self ): return f ' { self . email } -> { self . msg } ' def set_email ( email ): if '@' not in email : raise InvalidEmailError ( email ) print ( f 'Email set to: { email } ' ) try : set_email ( 'userexample.com' ) except InvalidEmailError as e : print ( e )
Kimenet
userexample.com -> Invalid email format
Magyarázat:
- Egy új InvalidEmailError kivételosztály van meghatározva az e-mail címek ellenőrzésére.
- Ha az adott e-mail nem tartalmazza a „@” jelet, a rendszer kivételt jelent.
- A try-except blokk észleli a hibát, és kinyomtatja a formázott üzenetet.
Mikor kell használni a felhasználó által meghatározott kivételeket?
A felhasználó által meghatározott kivételeket a következő forgatókönyvekben kell figyelembe venni:
- Konkrét hibákat jelez egy alkalmazásban (pl. InvalidAgeError DatabaseConnectionError).
- Világosabb és leíróbb hibaüzenetek biztosítása.
- Kapcsolódó hibák csoportjának külön kezelése a kivétel használatával.
A felhasználó által definiált kivételek használatával a programok olvashatóbbá, karbantarthatóbbá és könnyebben hibakereshetővé válnak.
Javasolt kvíz Kvíz szerkesztése 3 kérdésMi történik, ha egy felhasználó által meghatározott kivétel a kivétel helyett a RuntimeErrorból örökli?
- A
Nem lehet rajtakapni a használatát, kivéve
- B
Ellenőrizetlen kivétel lesz
- C
A kezelők futásidejű hibaként kezelik
- D
Elveszíti az egyéni attribútumokat
A RuntimeErrortól való öröklés lehetővé teszi, hogy futásidejű hibaként és egyéni hibaként is kezelhető legyen.
Miért használják általánosan a szuper().__init__(self.msg) függvényt az egyéni kivételosztályokban?
- A
A többszörös öröklődés elkerülése érdekében
- B
Az alap Kivétel osztály megfelelő inicializálása
- C
A visszakövetés felülbírálásához
- D
A kivétel automatikus emeléséhez
A super() meghívása biztosítja, hogy az alapkivétel megfelelően inicializálódjon az üzenettel.
Mi lesz kinyomtatva, ha egy egyéni kivétel felülírja az __str__() paramétert, és a kivétel belül kerül kinyomtatásra?
- A
A felülírt karakterlánc-ábrázolás
- B
A kivétel memóriacíme
- C
Csak az osztály neve
- D
Semmi, hacsak nem használjuk a repr()-et
print(e) meghívja a kivételobjektum __str__() értékét.
A kvíz sikeresen kitöltött pontszáma: 2 /3 Pontosság: 0% Jelentkezzen be a magyarázat megtekintéséhez 1 /3 1 /3 < Previous Következő >