Ako definovať vlastné výnimky v Pythone? (S príkladmi)

V tejto príručke sa naučíte, ako pomocou príkladov definovať vlastné výnimky v závislosti od vašich požiadaviek.

Python má množstvo zabudovaných výnimiek, ktoré nútia váš program vydávať chybu, keď sa niečo v programe pokazí.

Niekedy však možno budete musieť vytvoriť svoje vlastné výnimky, ktoré slúžia vášmu účelu.

Vytváranie vlastných výnimiek

V Pythone môžu používatelia definovať vlastné výnimky vytvorením novej triedy. Táto trieda výnimiek musí byť odvodená, priamo alebo nepriamo, zo zabudovanej Exceptiontriedy. Väčšina zabudovaných výnimiek je tiež odvodená z tejto triedy.

 >>> 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

Tu sme vytvorili používateľom definovanú výnimku s názvom, CustomErrorktorá dedí z Exceptiontriedy. Túto novú výnimku, podobne ako iné výnimky, možno raisevyvolať pomocou príkazu s voliteľnou chybovou správou.

Keď vyvíjame veľký program Python, je dobrým zvykom umiestňovať všetky používateľom definované výnimky, ktoré náš program vyvolá, do samostatného súboru. Robí to veľa štandardných modulov. Svoje výnimky definujú osobitne ako exceptions.pyalebo errors.py(všeobecne, ale nie vždy).

Užívateľom definovaná trieda výnimiek môže implementovať všetko, čo normálna trieda dokáže, ale všeobecne ich robíme jednoduché a výstižné. Väčšina implementácií deklaruje vlastnú základnú triedu a od tejto základnej triedy odvodzuje ďalšie triedy výnimiek. Tento koncept je objasnený v nasledujúcom príklade.

Príklad: Užívateľom definovaná výnimka v Pythone

V tomto príklade ukážeme, ako je možné v programe použiť používateľom definované výnimky na vyvolanie a zachytenie chýb.

Tento program požiada používateľa o zadanie čísla, kým správne neuhádne uložené číslo. Pomôže im to zistiť, či je ich odhad väčší alebo menší ako 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.")

Tu je ukážka tohto programu.

Zadajte číslo: 12 Táto hodnota je príliš veľká, skúste to znova! Zadajte číslo: 0 Táto hodnota je príliš malá, skúste to znova! Zadajte číslo: 8 Táto hodnota je príliš malá, skúste to znova! Zadajte číslo: 10 Gratulujeme! Uhádli ste správne.

Definovali sme základnú triedu s názvom Error.

Ďalšie dve výnimky ( ValueTooSmallErrora ValueTooLargeError), ktoré náš program skutočne vyvolá, sú odvodené z tejto triedy. Toto je štandardný spôsob definovania používateľom definovaných výnimiek v programovaní v Pythone, ale neobmedzujete sa iba na tento spôsob.

Prispôsobenie tried výnimiek

Túto triedu môžeme ďalej prispôsobiť tak, aby akceptovala ďalšie argumenty podľa našich potrieb.

Ak sa chcete dozvedieť viac o prispôsobovaní tried Výnimky, musíte mať základné vedomosti o objektovo orientovanom programovaní.

Navštívte objektovo orientované programovanie v Pythone a začnite sa učiť o objektovo orientovanom programovaní v Pythone.

Pozrime sa na jeden prí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ýkon

 Zadajte výšku platu: 2000 Traceback (posledný posledný hovor): Súbor „“, riadok 17, vo zvýšení SalaryNotInRangeError (plat) __main __. SalaryNotInRangeError: Plat nie je v rozmedzí (5000, 15000)

Tu sme prepísali konštruktor Exceptiontriedy, aby prijal naše vlastné vlastné argumenty salarya message. Potom sa konštruktor nadradenej Exceptiontriedy zavolá ručne pomocou self.messageargumentu pomocou super().

Vlastný self.salaryatribút je definovaný na použitie neskôr.

Zdedená __str__metóda Exceptiontriedy sa potom použije na zobrazenie príslušnej správy, keď SalaryNotInRangeErrorsa vyvolá.

Samotnú __str__metódu môžeme prispôsobiť aj jej prepísaní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ýkon

 Zadajte výšku platu: 2000 Traceback (posledný posledný hovor): Súbor "/home/bsoyuj/Desktop/Untitled-1.py", riadok 20, vo zvýšení SalaryNotInRangeError (plat) __main __. SalaryNotInRangeError: 2000 -> Plat nie je v ( Rozsah 5 000, 15 000)

Ak sa chcete dozvedieť viac o tom, ako zvládnuť výnimky v Pythone, navštívte stránku Spracovanie výnimiek Pythonu.

Zaujímavé články...