Kako določiti izjeme po meri v Pythonu? (Z primeri)

V tej vadnici boste izvedeli, kako s pomočjo primerov določite izjeme po meri, odvisno od vaših zahtev.

Python ima številne vgrajene izjeme, ki prisilijo vaš program, da odda napako, ko gre v programu kaj narobe.

Včasih pa boste morda morali ustvariti lastne izjeme po meri, ki ustrezajo vašemu namenu.

Ustvarjanje izjem po meri

V Pythonu lahko uporabniki določijo izjeme po meri z ustvarjanjem novega razreda. Ta razred izjem mora biti neposredno ali posredno izpeljan iz vgrajenega Exceptionrazreda. Iz tega razreda izhaja tudi večina vgrajenih izjem.

 >>> 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 smo ustvarili uporabniško določeno izjemo, ki se imenuje CustomErrorpodeduje iz Exceptionrazreda. To novo izjemo je mogoče, tako kot druge izjeme, dvigniti z uporabo raisestavka z neobveznim sporočilom o napaki.

Ko razvijamo velik program Python, je dobra praksa, da vse uporabniško določene izjeme, ki jih naš program sproži, shranimo v ločeno datoteko. Veliko standardnih modulov to počne. Izjeme opredelijo ločeno kot exceptions.pyali errors.py(na splošno, vendar ne vedno).

Uporabniško določen izjemen razred lahko izvaja vse, kar lahko naredi običajni razred, vendar jih na splošno naredimo preproste in jedrnate. Večina izvedb razglasi osnovni razred po meri in iz tega izpelje druge razrede izjem. Ta koncept je pojasnjen v naslednjem primeru.

Primer: Uporabniško določena izjema v Pythonu

V tem primeru bomo ponazorili, kako uporabniško določene izjeme lahko uporabimo v programu za odkrivanje in lovljenje napak.

Ta program bo od uporabnika zahteval, da vnese številko, dokler pravilno ne ugane shranjene številke. Za lažje razumevanje je podan namig, ali je njihovo ugibanje večje ali manjše od shranjene številke.

 # 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 vzorčni zagon tega programa.

Vnesite številko: 12 Ta vrednost je prevelika, poskusite znova! Vnesite številko: 0 Ta vrednost je premajhna, poskusite znova! Vnesite številko: 8 Ta vrednost je premajhna, poskusite znova! Vnesite številko: 10 Čestitamo! Uganili ste pravilno.

Določili smo osnovni razred, imenovan Error.

Drugi dve izjemi ( ValueTooSmallErrorin ValueTooLargeError), ki jih naš program dejansko navaja, izhajata iz tega razreda. To je standardni način definiranja uporabniško določenih izjem v programiranju Python, vendar niste omejeni le na ta način.

Prilagajanje razredov izjem

Ta razred lahko nadalje prilagodimo tako, da sprejme druge argumente v skladu z našimi potrebami.

Če želite izvedeti več o prilagajanju razredov izjem, morate imeti osnovno znanje objektno usmerjenega programiranja.

Obiščite Python objektno usmerjeno programiranje, da začnete spoznavati objektno orientirano programiranje v Pythonu.

Oglejmo si en primer:

 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)

Izhod

 Vnesite znesek plače: 2000 Traceback (zadnji zadnji klic): Datoteka "", vrstica 17, pri dvigu SalaryNotInRangeError (plača) __main __. SalaryNotInRangeError: Plača ni v območju (5000, 15000)

Tu smo preglasili konstruktor Exceptionrazreda, da je sprejel lastne argumente po meri salaryin message. Nato Exceptionse ročno pokliče konstruktor nadrejenega razreda z uporabo self.messageargumenta super().

self.salaryAtribut po meri je opredeljen za poznejšo uporabo.

Podedovana __str__metoda Exceptionrazreda se nato uporabi za prikaz ustreznega sporočila, ko SalaryNotInRangeErrorje dvignjeno.

__str__Metodo lahko prilagodimo tudi tako, da jo preglasimo.

 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)

Izhod

 Vnesite znesek plače: 2000 Traceback (zadnji zadnji klic): Datoteka "/home/bsoyuj/Desktop/Untitled-1.py", vrstica 20, v dvig SalaryNotInRangeError (plača) __main __. SalaryNotInRangeError: 2000 -> Plača ni v ( 5000, 15000)

Če želite izvedeti več o ravnanju z izjemami v Pythonu, obiščite Python Exception Handling.

Zanimive Članki...