V tomto kurzu se naučíte, jak pomocí příkladů definovat vlastní výjimky v závislosti na vašich požadavcích.
Python má řadu vestavěných výjimek, které nutí váš program vydat chybu, když se něco v programu pokazí.
Někdy však možná budete muset vytvořit vlastní vlastní výjimky, které budou sloužit vašemu účelu.
Vytváření vlastních výjimek
V Pythonu mohou uživatelé definovat vlastní výjimky vytvořením nové třídy. Tato třída výjimek musí být odvozena, přímo nebo nepřímo, z integrované Exception
třídy. Většina integrovaných výjimek je také odvozena z této třídy.
>>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred
Tady jsme vytvořili uživatelem definovanou výjimku s názvem, CustomError
která dědí z Exception
třídy. Tuto novou výjimku, stejně jako jiné výjimky, lze vyvolat pomocí raise
příkazu s volitelnou chybovou zprávou.
Když vyvíjíme velký program v Pythonu, je dobrým zvykem umístit všechny uživatelem definované výjimky, které náš program vyvolá, do samostatného souboru. Mnoho standardních modulů to dělá. Definují své výjimky samostatně jako exceptions.py
nebo errors.py
(obecně, ale ne vždy).
Uživatelem definovaná třída výjimek může implementovat vše, co normální třída dokáže, ale obecně je děláme jednoduchými a stručnými. Většina implementací deklaruje vlastní základní třídu a odvozuje další třídy výjimek z této základní třídy. Tento koncept je objasněn v následujícím příkladu.
Příklad: Uživatelem definovaná výjimka v Pythonu
V tomto příkladu si ukážeme, jak lze v programu použít výjimky definované uživatelem k vyvolání a zachycení chyb.
Tento program požádá uživatele o zadání čísla, dokud neuhodne správně uložené číslo. Abychom jim pomohli to zjistit, je poskytnuta nápověda, zda je jejich odhad větší nebo menší než uložené číslo.
# define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")
Zde je ukázkový běh tohoto programu.
Zadejte číslo: 12 Tato hodnota je příliš velká, zkuste to znovu! Zadejte číslo: 0 Tato hodnota je příliš malá, zkuste to znovu! Zadejte číslo: 8 Tato hodnota je příliš malá, zkuste to znovu! Zadejte číslo: 10 Gratulujeme! Uhodli jste správně.
Definovali jsme základní třídu s názvem Error
.
Další dvě výjimky ( ValueTooSmallError
a ValueTooLargeError
), které náš program ve skutečnosti vyvolává, jsou odvozeny z této třídy. Toto je standardní způsob, jak definovat uživatelem definované výjimky v programování v Pythonu, ale nejste omezeni pouze na tento způsob.
Přizpůsobení tříd výjimek
Tuto třídu můžeme dále přizpůsobit tak, aby přijímala další argumenty podle našich potřeb.
Chcete-li se dozvědět více o přizpůsobení tříd výjimek, musíte mít základní znalosti objektově orientovaného programování.
Navštivte Python Object Oriented Programming a začněte se učit o Object-Oriented Programming v Pythonu.
Podívejme se na jeden příklad:
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Výstup
Zadejte částku platu: 2000 Traceback (poslední poslední hovor): Soubor "", řádek 17, ve zvýšení SalaryNotInRangeError (plat) __main __. SalaryNotInRangeError: Plat není v rozsahu (5000, 15000)
Tady jsme přepsali konstruktor Exception
třídy, aby přijal naše vlastní vlastní argumenty salary
a message
. Potom je konstruktor nadřazené Exception
třídy volán ručně pomocí self.message
argumentu using super()
.
Vlastní self.salary
atribut je definován pro pozdější použití.
Zděděná __str__
metoda Exception
třídy se poté použije k zobrazení odpovídající zprávy, když SalaryNotInRangeError
je vyvolána.
Můžeme také přizpůsobit __str__
samotnou metodu přepsáním.
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Výstup
Zadejte výši platu: 2000 Traceback (poslední hovor poslední): Soubor "/home/bsoyuj/Desktop/Untitled-1.py", řádek 20, ve zvýšení SalaryNotInRangeError (plat) __main __. SalaryNotInRangeError: 2000 -> Plat není v ( 5000, 15000)
Další informace o tom, jak můžete zpracovat výjimky v Pythonu, najdete v části Zpracování výjimek Pythonu.