Uživatelem definované výjimky se vytvářejí definováním nové třídy, která dědí z Vestavěná výjimka v Pythonu třídy nebo jedné z jejích podtříd. Tímto způsobem můžeme vytvářet vlastní chybové zprávy a zpracovávat konkrétní chyby způsobem, který dává smysl naší aplikaci.
Kroky k vytvoření a použití uživatelem definovaných výjimek
Chcete-li vytvořit a používat uživatelem definované výjimky v Pythonu, postupujte takto:
- Definujte novou třídu výjimky: Vytvořte novou třídu, která dědí z Exception nebo kterékoli z jejích podtříd.
- Zvýšit výjimku: Použijte příkaz raise k vyvolání uživatelem definované výjimky, když nastane určitá podmínka.
- Zpracovat výjimku: Ke zpracování uživatelem definované výjimky použijte bloky try-except.
Příklad: V tomto příkladu vytvoříme vlastní výjimku InvalidAgeError, abychom zajistili, že hodnoty věku spadají 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
Vysvětlení:
- Třída InvalidAgeError dědí z výjimky. Definuje an __horký__ způsob, jak přijmout věk a zprávu.
- Metoda __str__ vrací čitelnou řetězcovou reprezentaci chyby.
- Pokud je v set_age() věk mimo platný rozsah (0–120), vyvolá se výjimka.
- Blok try-except zachytí výjimku a vytiskne chybovou zprávu.
Přizpůsobení tříd výjimek
Když vytvoříme vlastní výjimku, podtřídíme třídu Exception vestavěnou v Pythonu (nebo podtřídu jako ValueError TypeError atd.). Poté můžeme přidat vlastní metody atributů nebo vlastní logiku, aby byla naše výjimka informativnější.
Můžeme také vylepšit vlastní výjimky přidáním dalších atributů nebo přepisovacích metod.
Příklad: Zde vylepšujeme InvalidAgeError přidáním kódu chyby a přizpůsobením chybové zprávy.
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
Vysvětlení:
- InvalidAgeError má nyní další atribut error_code.
- Metoda __str__ je přepsána, aby se zobrazil kód chyby i věk.
- Po provedení set_age(150) je vyvolána výjimka a zachycena v bloku try-except.
- Přizpůsobená chybová zpráva se vytiskne, takže chyba bude popisnější.
Použití standardních výjimek jako základní třídy
Někdy místo přímého dědění z výjimky můžeme vytvořit vlastní výjimku podtřídou standardní výjimky, jako je RuntimeError ValueError atd. To je užitečné, když by se s vaší vlastní výjimkou mělo zacházet jako se specifickým druhem chyby.
Příklad: Tento příklad ukazuje, jak vytvořit vlastní výjimku NetworkError zděděním z RuntimeError, což je standardní vestavěná výjimka.
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') Vysvětlení:
- NetworkError dědí z RuntimeError, což je vestavěný typ výjimky.
- Po vyvolání je zpráva uložena v atributu args jako n-tice.
- Výjimka je zachycena a jsou zobrazeny její uložené argumenty.
Příklad ze skutečného světa: Chyba neplatného e-mailu
Zde je jednoduchý příklad, kdy vyvoláme vlastní výjimku, pokud e-mailová adresa není 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
Vysvětlení:
- Pro ověření e-mailových adres je definována nová třída výjimky InvalidEmailError.
- Pokud daný e-mail neobsahuje '@', je vyvolána výjimka.
- Blok try-except zachytí chybu a vytiskne naformátovanou zprávu.
Kdy použít uživatelem definované výjimky?
Uživatelsky definované výjimky by měly být zváženy v následujících scénářích:
- Reprezentující konkrétní chyby v aplikaci (např. InvalidAgeError DatabaseConnectionError).
- Poskytování jasnějších a popisnějších chybových zpráv.
- Samostatné zpracování skupiny souvisejících chyb pomocí kromě.
Použitím uživatelsky definovaných výjimek se programy stávají čitelnějšími, udržovatelné a snadněji laditelné.