Selles õpetuses saate õppida näidete abil määratlema kohandatud erandeid vastavalt teie vajadustele.
Pythonis on arvukalt sisseehitatud erandeid, mis sunnivad teie programmi vea väljastama, kui programmis midagi valesti läheb.
Mõnikord peate võib-olla siiski looma oma kohandatud erandid, mis teie eesmärki täidavad.
Kohandatud erandite loomine
Pythonis saavad kasutajad uue klassi loomisega määratleda kohandatud erandeid. See erandklass tuleb tuletada kas otseselt või kaudselt sisseehitatud Exception
klassist. Ka enamik sisseehitatud erandeid tuletatakse sellest klassist.
>>> 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
Siin oleme loonud kasutaja määratletud erandi, CustomError
mis pärineb klassilt Exception
. Selle uue erandi, nagu ka teiste erandite, saab tõsta raise
valikulise tõrketeatega avalduse abil.
Suure Pythoni programmi väljatöötamisel on hea tava paigutada kõik kasutaja määratletud erandid eraldi faili. Paljud standardmoodulid teevad seda. Nad määratlevad nende erandite eraldi exceptions.py
või errors.py
(tavaliselt, kuid mitte alati).
Kasutaja määratletud erandklassi abil saab rakendada kõike, mida tavaline klass teha saab, kuid üldjuhul muudame need lihtsaks ja lühikeseks. Enamik rakendusi deklareerib kohandatud baasklassi ja tuletab sellest baasklassist ka teisi erandklasse. See mõiste on selgem järgmises näites.
Näide: kasutaja määratletud erand Pythonis
Selles näites illustreerime, kuidas kasutaja määratletud erandeid saab programmis vigade tekitamiseks ja tabamiseks kasutada.
See programm palub kasutajal sisestada numbri, kuni ta arvab salvestatud numbri õigesti. Selle välja selgitamiseks antakse vihje, kas nende arvamus on suurem või väiksem kui salvestatud number.
# 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.")
Siin on selle programmi näidisjooks.
Sisestage arv: 12 See väärtus on liiga suur, proovige uuesti! Sisestage arv: 0 See väärtus on liiga väike, proovige uuesti! Sisestage number: 8 See väärtus on liiga väike, proovige uuesti! Sisestage number: 10 Palju õnne! Sa arvasid seda õigesti.
Oleme määranud baasklassi nimega Error
.
Kaks ülejäänud erandit ( ValueTooSmallError
ja ValueTooLargeError
), mille meie programm tegelikult tõstatab, tulenevad sellest klassist. See on tavaline viis kasutaja määratletud erandite määratlemiseks Pythoni programmeerimisel, kuid te ei piirdu ainult selle viisiga.
Erandklasside kohandamine
Saame seda klassi veelgi kohandada, et aktsepteerida muid argumente vastavalt meie vajadustele.
Erandklasside kohandamise kohta lisateabe saamiseks peate omama põhiteadmisi objektile orienteeritud programmeerimisest.
Objektipõhise programmeerimise õppimise alustamiseks Pythonis külastage Pythoni objektiorienteeritud programmeerimist.
Vaatame ühte näidet:
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äljund
Sisestage palgasumma: 2000 Traceback (viimane kõne viimati): fail "", rida 17, tõstes PalaryNotInRangeError (palk) __main __. SalaryNotInRangeError: Palk ei ole vahemikus (5000, 15000)
Siin oleme Exception
klassi konstruktori tühistanud, et aktsepteerida meie enda kohandatud argumente salary
ja message
. Seejärel Exception
kutsutakse vanemklassi konstruktor käsitsi, self.message
kasutades argumenti super()
.
Kohandatud self.salary
atribuut on määratletud kasutamiseks hiljem.
Seejärel kasutatakse klassi päritud __str__
meetodit Exception
vastava teate kuvamiseks, kui see SalaryNotInRangeError
on tõstetud.
Samuti võime __str__
meetodit ennast kohandada , ületades selle.
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äljund
Sisestage palgasumma: 2000 Traceback (viimane kõne viimati): fail "/home/bsoyuj/Desktop/Untitled-1.py", rida 20, tõstes PalaryNotInRangeError (palk) __main __. SalaryNotInRangeError: 2000 -> Palk pole ( 5000, 15000)
Lisateabe saamiseks selle kohta, kuidas saate Pythonis erandeid käsitleda, külastage Pythoni erandite käitlemist.