Ebben az oktatóanyagban megtanulhatja, hogyan definiálja az egyedi kivételeket az igényeitől függően példák segítségével.
A Python számos beépített kivétellel kényszeríti a programot arra, hogy hibát adjon ki, ha valami nem megfelelő a programban.
Előfordulhat azonban, hogy saját egyedi kivételeket kell létrehoznia, amelyek a célját szolgálják.
Egyedi kivételek létrehozása
A Pythonban a felhasználók egyedi osztályokat hozhatnak létre új osztály létrehozásával. Ezt a kivételosztályt közvetlenül vagy közvetve a beépített Exception
osztályból kell levezetni . A beépített kivételek nagy része szintén ebből az osztályból származik.
>>> 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
Itt létrehoztunk egy felhasználó által definiált kivételt, CustomError
amely örököl az Exception
osztálytól. Ez az új kivétel, a többi kivételhez hasonlóan, raise
opcionális hibaüzenettel rendelkező utasítás segítségével emelhető fel .
Amikor egy nagy Python programot fejlesztünk, célszerű minden, a program által felvetett, felhasználó által definiált kivételt külön fájlba helyezni. Sok standard modul teszi ezt. Kivételeiket külön exceptions.py
vagy errors.py
(általában, de nem mindig) külön definiálják .
A felhasználó által definiált kivétel osztály képes megvalósítani mindazt, amit egy normális osztály megtehet, de mi általában egyszerűvé és tömöré tesszük őket. A legtöbb megvalósítás egyéni alaposztályt deklarál, és más kivételosztályokat vezet le ebből az alaposztályból. Ezt a koncepciót a következő példa világosabbá teszi.
Példa: Felhasználó által definiált kivétel a Pythonban
Ebben a példában bemutatjuk, hogyan lehet a felhasználó által definiált kivételeket felhasználni egy programban a hibák felvetésére és elkapására.
Ez a program addig kéri a felhasználót, hogy adjon meg egy számot, amíg a kitalált számot helyesen kitalálja. Annak érdekében, hogy kitalálják őket, adunk egy tippet, hogy kitalálásuk nagyobb vagy kevesebb, mint a tárolt szám.
# 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.")
Itt van egy példa a program futtatására.
Írjon be egy számot: 12 Ez az érték túl nagy, próbálja újra! Írjon be egy számot: 0 Ez az érték túl kicsi, próbálja újra! Írjon be egy számot: 8 Ez az érték túl kicsi, próbálja újra! Írjon be egy számot: 10 Gratulálunk! Helyesen tippelted.
Meghatároztuk az úgynevezett alaposztályt Error
.
A programunk által felvetett másik két kivétel ( ValueTooSmallError
és ValueTooLargeError
) ebből az osztályból származik. Ez a szokásos módszer a felhasználó által definiált kivételek definiálására a Python programozásban, de nem korlátozódik erre.
A kivételosztályok testreszabása
Tovább testreszabhatjuk ezt az osztályt, hogy más érveket elfogadhassunk igényeink szerint.
A Kivétel osztályok testreszabásához meg kell ismernie az objektumorientált programozás alapismereteit.
Látogasson el a Python objektumorientált programozásra, hogy megismerje az objektumorientált programozást a Pythonban.
Nézzünk meg egy példát:
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)
Kimenet
Adja meg a fizetés összegét: 2000 Traceback (a legutóbbi hívás utoljára): "" fájl, 17. sor, emelésben.
Itt felülbíráltuk az Exception
osztály konstruktorát, hogy elfogadjuk saját egyéni argumentumainkat salary
és message
. Ezután a szülő Exception
osztály konstruktorát manuálisan hívjuk meg a self.message
argumentummal super()
.
Az egyedi self.salary
attribútum későbbi felhasználásra van meghatározva.
Ezután __str__
az Exception
osztály öröklött metódusát használjuk a megfelelő üzenet megjelenítéséhez, amikor fel SalaryNotInRangeError
van emelve.
__str__
Magát a módszert testreszabhatjuk felülírással is.
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)
Kimenet
Adja meg a fizetés összegét: 2000 Traceback (a legutóbbi hívás utoljára): A "/home/bsoyuj/Desktop/Untitled-1.py" fájl 20. sora az emelésben SalaryNotInRangeError (fizetés) __main __. SalaryNotInRangeError: 2000 -> A fizetés nincs benne ( 5000, 15000) tartományban
Ha többet szeretne megtudni arról, hogy miként kezelheti a kivételeket a Pythonban, keresse fel a Python kivételkezelést.