Šioje pamokoje sužinosite, kaip pavyzdžių pagalba apibrėžti pasirinktines išimtis, atsižvelgiant į jūsų reikalavimus.
„Python“ turi daugybę įmontuotų išimčių, kurios priverčia jūsų programą pateikti klaidą, kai programoje kažkas negerai.
Tačiau kartais gali tekti susikurti savo išimtis, kurios atitiktų jūsų tikslą.
Tinkintų išimčių kūrimas
„Python“ vartotojai gali apibrėžti pasirinktines išimtis, sukurdami naują klasę. Ši išimčių klasė turi būti tiesiogiai arba netiesiogiai gauta iš įmontuotos Exception
klasės. Dauguma įmontuotų išimčių taip pat yra šios klasės.
>>> 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
Čia mes sukūrėme vartotojo apibrėžtą išimtį, CustomError
kuri paveldima iš Exception
klasės. Ši nauja išimtis, kaip ir kitos išimtys, gali būti iškelta naudojant raise
teiginį su neprivalomu klaidos pranešimu.
Kuriant didelę „Python“ programą, yra gera praktika visas vartotojo apibrėžtas išimtis, kurias kelia mūsų programa, į atskirą failą. Daugelis standartinių modulių tai daro. Jie atskirai apibrėžia savo išimtis kaip exceptions.py
arba errors.py
(paprastai, bet ne visada).
Vartotojo apibrėžta išimčių klasė gali įgyvendinti viską, ką gali įprasta klasė, tačiau mes jas paprastai padarome paprastas ir glaustas. Daugelis diegimų deklaruoja pasirinktinę bazinę klasę ir iš šios klasės išskiria kitas išimčių klases. Ši sąvoka yra aiškesnė šiame pavyzdyje.
Pavyzdys: vartotojo nustatyta išimtis „Python“
Šiame pavyzdyje mes parodysime, kaip vartotojo nustatytos išimtys gali būti naudojamos programoje klaidoms išaiškinti ir sugauti.
Ši programa paprašys vartotojo įvesti numerį, kol jis teisingai atspės išsaugotą numerį. Norint padėti jiems tai išsiaiškinti, pateikiama užuomina, ar jų spėjimas yra didesnis ar mažesnis už išsaugotą skaičių.
# 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.")
Čia yra pavyzdinis šios programos vykdymas.
Įveskite skaičių: 12 Ši vertė yra per didelė, bandykite dar kartą! Įveskite skaičių: 0 Ši vertė per maža, bandykite dar kartą! Įveskite skaičių: 8 Ši vertė yra per maža, bandykite dar kartą! Įveskite skaičių: 10 Sveikiname! Jūs atspėjote teisingai.
Mes apibrėžėme bazinę klasę, vadinamą Error
.
Kitos dvi išimtys ( ValueTooSmallError
ir ValueTooLargeError
), kurias iš tikrųjų kelia mūsų programa, yra kilusios iš šios klasės. Tai yra standartinis būdas apibrėžti vartotojo apibrėžtas išimtis programuojant „Python“, tačiau jūs tuo neapsiribojate.
Išimties klasių pritaikymas
Mes galime toliau pritaikyti šią klasę, kad priimtume kitus argumentus pagal mūsų poreikius.
Norėdami sužinoti apie „Exception“ klasių pritaikymą, turite turėti pagrindines žinias apie į objektą orientuotą programavimą.
Apsilankykite „Python Object Oriented Programming“, kad pradėtumėte mokytis apie „Python“ į objektą orientuotą programavimą.
Pažvelkime į vieną pavyzdį:
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)
Rezultatas
Įveskite atlyginimo sumą: 2000 „Traceback“ (paskutinis paskutinis skambutis paskutinis): Failo „“ 17 eilutė, pakeliant „SalaryNotInRangeError“ (atlyginimas) __main __. „SalaryNotInRangeError“: atlyginimas nėra (5000, 15000) intervale
Čia mes nepaisėme Exception
klasės konstruktoriaus, kad priimtų mūsų pačių pasirinktus argumentus salary
ir message
. Tada tėvų Exception
klasės konstruktorius iškviečiamas rankiniu būdu naudojant self.message
argumentą super()
.
Tinkintas self.salary
atributas apibrėžtas naudoti vėliau.
Tada paveldimas klasės __str__
metodas Exception
naudojamas atitinkamam pranešimui rodyti, kai jis SalaryNotInRangeError
yra iškeltas.
Mes taip pat galime pritaikyti patį __str__
metodą, nepaisydami jo.
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)
Rezultatas
Įveskite atlyginimo sumą: 2000 „Traceback“ (paskutinis paskutinis skambutis paskutinis): Failo „/home/bsoyuj/Desktop/Untitled-1.py“ 20 eilutė, pakeliant „SalaryNotInRangeError“ (atlyginimas) __main __. „SalaryNotInRangeError: 2000 -> Atlyginimas nėra ( 5000, 15000) diapazonas
Norėdami sužinoti daugiau apie tai, kaip „Python“ galite tvarkyti išimtis, apsilankykite „Python“ išimčių tvarkyme.