Kā definēt pielāgotus izņēmumus Python? (Ar piemēriem)

Šajā apmācībā jūs uzzināsit, kā ar piemēru palīdzību definēt pielāgotos izņēmumus atkarībā no jūsu prasībām.

Python ir daudz iebūvētu izņēmumu, kas liek jūsu programmai izdot kļūdu, ja kaut kas programmā notiek nepareizi.

Tomēr dažreiz jums var būt nepieciešams izveidot savus pielāgotos izņēmumus, kas atbilst jūsu mērķim.

Pielāgotu izņēmumu veidošana

Programmā Python lietotāji var definēt pielāgotus izņēmumus, izveidojot jaunu klasi. Šī izņēmuma klase tieši vai netieši jāgūst no iebūvētās Exceptionklases. Arī lielākā daļa iebūvēto izņēmumu ir atvasināti no šīs klases.

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

Šeit mēs esam izveidojuši lietotāja definētu izņēmumu, CustomErrorkas tiek mantots no Exceptionklases. Šo jauno izņēmumu, tāpat kā citus izņēmumus, var izvirzīt, izmantojot raisepaziņojumu ar izvēles kļūdas ziņojumu.

Izstrādājot lielu Python programmu, ir laba prakse visus lietotāja definētos izņēmumus, kurus mūsu programma izvirza, ievietot atsevišķā failā. Daudzi standarta moduļi to dara. Viņi savus izņēmumus definē atsevišķi kā exceptions.pyvai errors.py(parasti, bet ne vienmēr).

Lietotāja definēta izņēmuma klase var īstenot visu, ko var darīt parastā klase, taču mēs tos parasti padarām vienkāršus un kodolīgus. Lielākā daļa ieviešanas deklarē pielāgotu bāzes klasi un no šīs bāzes klases iegūst citas izņēmuma klases. Šis jēdziens ir skaidrāks nākamajā piemērā.

Piemērs: lietotāja noteikts izņēmums Python

Šajā piemērā mēs ilustrēsim, kā lietotāja definētus izņēmumus var izmantot programmā, lai palielinātu un noķertu kļūdas.

Šī programma lūgs lietotājam ievadīt numuru, līdz viņš pareizi uzminēs saglabāto numuru. Lai palīdzētu viņiem to noskaidrot, tiek sniegts mājiens, vai viņu minējums ir lielāks vai mazāks par saglabāto numuru.

 # 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.")

Šeit ir šīs programmas izpildes paraugs.

Ievadiet skaitli: 12 Šī vērtība ir pārāk liela, mēģiniet vēlreiz! Ievadiet skaitli: 0 Šī vērtība ir pārāk maza, mēģiniet vēlreiz! Ievadiet skaitli: 8 Šī vērtība ir pārāk maza, mēģiniet vēlreiz! Ievadiet skaitli: 10 Apsveicam! Jūs to pareizi uzminējāt.

Mēs esam definējuši bāzes klasi, ko sauc Error.

Pārējie divi izņēmumi ( ValueTooSmallErrorun ValueTooLargeError), kurus faktiski izvirza mūsu programma, ir atvasināti no šīs klases. Šis ir standarta veids, kā definēt lietotāja definētus izņēmumus Python programmēšanā, taču jūs neaprobežojaties tikai ar šo veidu.

Izņēmuma klases pielāgošana

Mēs varam tālāk pielāgot šo klasi, lai pieņemtu citus argumentus atbilstoši mūsu vajadzībām.

Lai uzzinātu par izņēmuma klases pielāgošanu, jums ir jābūt pamatzināšanām par objektorientētu programmēšanu.

Apmeklējiet Python objektorientēto programmēšanu, lai sāktu mācīties par objektorientētu programmēšanu Python.

Apskatīsim vienu piemēru:

 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)

Rezultāts

 Ievadiet algas summu: 2000 Traceback (pēdējais zvans pēdējais): Fails "", 17. rinda, paaugstinājumā SalaryNotInRangeError (alga) __main __. SalaryNotInRangeError: Alga nav diapazonā (5000, 15000)

Šeit mēs esam ignorējuši Exceptionklases konstruktoru, lai pieņemtu mūsu pašu pielāgotos argumentus salaryun message. Pēc tam vecāku Exceptionklases konstruktors tiek izsaukts manuāli, izmantojot self.messageargumentu super().

Pielāgotais self.salaryatribūts ir definēts izmantošanai vēlāk.

Pēc __str__tam Exceptionklases pārmantotā metode tiek izmantota, lai parādītu atbilstošo ziņojumu, kad tā SalaryNotInRangeErrorir pacelta.

Mēs varam arī pielāgot pašu __str__metodi, ignorējot to.

 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)

Rezultāts

 Ievadiet algas summu: 2000 Traceback (pēdējais zvans pēdējais): Fails "/home/bsoyuj/Desktop/Untitled-1.py", 20. rinda, paaugstinājumā SalaryNotInRangeError (alga) __main __. SalaryNotInRangeError: 2000 -> Alga nav ( 5000, 15000) diapazons

Lai uzzinātu vairāk par to, kā rīkoties ar izņēmumiem Python, apmeklējiet Python izņēmumu apstrādi.

Interesanti raksti...