Používateľom definované výnimky sa vytvárajú definovaním novej triedy, ktorá dedí z Vstavaná výnimka Pythonu triedy alebo jednej z jej podtried. Týmto spôsobom môžeme vytvárať vlastné chybové hlásenia a spracovávať špecifické chyby spôsobom, ktorý dáva zmysel našej aplikácii.
Kroky na vytvorenie a používanie výnimiek definovaných používateľom
Pri vytváraní a používaní výnimiek definovaných používateľom v Pythone postupujte podľa týchto krokov:
- Definujte novú triedu výnimky: Vytvorte novú triedu, ktorá dedí z výnimky alebo ktorejkoľvek z jej podtried.
- Zvýšte výnimku: Príkaz raise použite na vyvolanie užívateľom definovanej výnimky, keď nastane špecifický stav.
- Vybaviť výnimku: Na spracovanie používateľom definovanej výnimky použite bloky try-except.
Príklad: V tomto príklade vytvoríme vlastnú výnimku InvalidAgeError, aby sme zabezpečili, že hodnoty veku budú spadať do platného rozsahu (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)
Výstup
150 -> Age must be between 0 and 120
Vysvetlenie:
- Trieda InvalidAgeError dedí z výnimky. Definuje an __horúce__ spôsob prijatia veku a správy.
- Metóda __str__ vracia čitateľnú reťazcovú reprezentáciu chyby.
- Ak je vek v set_age() mimo platného rozsahu (0–120), vyvolá sa výnimka.
- Blok try-except zachytí výnimku a vytlačí chybové hlásenie.
Prispôsobenie tried výnimiek
Keď vytvoríme vlastnú výnimku, podtriedime vstavanú triedu Exception Pythonu (alebo podtriedu ako ValueError TypeError atď.). Potom môžeme pridať vlastné metódy atribútov alebo vlastnú logiku, aby bola naša výnimka informatívnejšia.
Vlastné výnimky môžeme tiež vylepšiť pridaním ďalších atribútov alebo prepísaných metód.
prevod na reťazec
Príklad: Tu zlepšujeme InvalidAgeError pridaním kódu chyby a prispôsobením chybového hlásenia.
Pythonclass 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)
Výstup
[Error Code 1001] 150 -> Age must be between 0 and 120
Vysvetlenie:
- InvalidAgeError má teraz ďalší atribút error_code.
- Metóda __str__ je prepísaná, aby sa zobrazil kód chyby aj vek.
- Keď sa vykoná set_age(150), výnimka sa vyvolá a zachytí v bloku try-except.
- Vytlačí sa prispôsobené chybové hlásenie, vďaka čomu je chyba popisnejšia.
Používanie štandardných výnimiek ako základnej triedy
Niekedy namiesto priameho dedenia z výnimky môžeme vytvoriť vlastnú výnimku podtriedou štandardnej výnimky, ako je RuntimeError ValueError atď. Toto je užitočné, keď by sa vaša vlastná výnimka mala považovať za špecifický druh chyby.
Príklad: Tento príklad ukazuje, ako vytvoriť vlastnú výnimku NetworkError dedením z RuntimeError, čo je štandardná vstavaná výnimka.
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)
Výstup
('Connection failed') Vysvetlenie:
zoznam triediť podľa java
- NetworkError dedí z RuntimeError, čo je vstavaný typ výnimky.
- Po vyvolaní je správa uložená v atribúte args ako n-tica.
- Výnimka sa zachytí a zobrazia sa jej uložené argumenty.
Príklad zo skutočného sveta: Chyba neplatného e-mailu
Tu je jednoduchý príklad, kde vyvoláme vlastnú výnimku, ak e-mailová adresa nie je platná:
Pythonclass 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)
Výstup
userexample.com -> Invalid email format
Vysvetlenie:
- Na overenie e-mailových adries je definovaná nová trieda výnimky InvalidEmailError.
- Ak daný e-mail neobsahuje '@', vyvolá sa výnimka.
- Blok try-except zachytí chybu a vytlačí naformátovanú správu.
Kedy použiť používateľom definované výnimky?
Používateľom definované výnimky by sa mali zvážiť v nasledujúcich scenároch:
- Predstavovanie konkrétnych chýb v aplikácii (napr. InvalidAgeError DatabaseConnectionError).
- Poskytovanie jasnejších a popisnejších chybových hlásení.
- Samostatné zaobchádzanie so skupinou súvisiacich chýb pomocou okrem.
Použitím užívateľom definovaných výnimiek sa programy stanú čitateľnejšími, udržovateľnými a ľahšie laditeľnými.