Kuinka määritellä mukautetut poikkeukset Pythonissa? (Esimerkkejä)

Tässä opetusohjelmassa opit määrittämään mukautetut poikkeukset vaatimuksistasi esimerkkien avulla.

Pythonissa on useita sisäänrakennettuja poikkeuksia, jotka pakottavat ohjelman tuottamaan virheen, kun jokin ohjelmassa menee pieleen.

Joskus sinun on kuitenkin luotava omat poikkeuksesi, jotka palvelevat tarkoitustasi.

Mukautettujen poikkeusten luominen

Pythonissa käyttäjät voivat määritellä mukautettuja poikkeuksia luomalla uuden luokan. Tämä poikkeusluokka on johdettava joko suoraan tai epäsuorasti sisäänrakennetusta Exceptionluokasta. Suurin osa sisäänrakennetuista poikkeuksista on myös peräisin tästä luokasta.

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

Tässä olemme luoneet käyttäjän määrittelemän poikkeuksen, CustomErrorjoka periytyy Exceptionluokalta. Tämä uusi poikkeus, kuten muutkin poikkeukset, voidaan nostaa käyttämällä raiselausetta valinnaisella virheilmoituksella.

Kun kehitämme suurta Python-ohjelmaa, on hyvä käytäntö sijoittaa kaikki käyttäjän määrittelemät poikkeukset erilliseen tiedostoon. Monet vakiomoduulit tekevät tämän. He määrittelevät poikkeuksensa erikseen exceptions.pytai errors.py(yleensä, mutta eivät aina).

Käyttäjän määrittelemä poikkeusluokka voi toteuttaa kaiken, mitä normaali luokka voi tehdä, mutta teemme niistä yleensä yksinkertaisia ​​ja ytimekkäitä. Suurin osa toteutuksista julistaa mukautetun perusluokan ja johtaa muut poikkeusluokat tästä perusluokasta. Tämä käsite on selkeämpi seuraavassa esimerkissä.

Esimerkki: Käyttäjän määrittelemä poikkeus Pythonissa

Tässä esimerkissä havainnollistetaan, kuinka käyttäjän määrittelemiä poikkeuksia voidaan käyttää ohjelmassa virheiden keräämiseksi ja havaitsemiseksi.

Tämä ohjelma pyytää käyttäjää syöttämään numeron, kunnes hän arvaa tallennetun numeron oikein. Auttaa heitä selvittämään asiasta vihje siitä, onko heidän arvauksensa suurempi vai vähemmän kuin tallennettu numero.

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

Tässä on esimerkki tästä ohjelmasta.

Syötä numero: 12 Tämä arvo on liian suuri, yritä uudelleen! Syötä numero: 0 Tämä arvo on liian pieni, yritä uudelleen! Syötä numero: 8 Tämä arvo on liian pieni, yritä uudelleen! Anna numero: 10 Onnittelut! Arvasit sen oikein.

Olemme määrittäneet perusluokan nimeltä Error.

Kaksi muuta poikkeusta ( ValueTooSmallErrorja ValueTooLargeError), jotka ohjelmamme todella tuo esiin, ovat peräisin tästä luokasta. Tämä on tavanomainen tapa määritellä käyttäjän määrittelemät poikkeukset Python-ohjelmoinnissa, mutta et ole rajoittunut vain tähän tapaan.

Poikkeusluokkien mukauttaminen

Voimme edelleen mukauttaa tätä luokkaa hyväksymään muut argumentit tarpeidemme mukaan.

Jos haluat oppia poikkeusluokkien mukauttamisesta, sinulla on oltava perustiedot objektisuuntautuneesta ohjelmoinnista.

Käy Python Object Oriented Programming -sovelluksessa aloittaaksesi oppimisen Object Oriented Programming -ohjelmasta Pythonissa.

Katsotaanpa yhtä esimerkkiä:

 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)

Tuotos

 Syötä palkan määrä: 2000 jäljitys (viimeisin puhelu viimeisin): Tiedosto "", rivi 17, korotuksessa PalaryNotInRangeError (palkka) __main __. SalaryNotInRangeError: Palkka ei ole (5000, 15000) alueella

Tässä olemme ohittaneet Exceptionluokan rakentajan hyväksyäkseen omat mukautetut argumenttimme salaryja message. Sitten vanhemman Exceptionluokan konstruktori kutsutaan manuaalisesti self.messageargumentin kanssa super().

Mukautettu self.salarymääritte on määritelty käytettäväksi myöhemmin.

Luokan perittyä __str__menetelmää Exceptionkäytetään sitten vastaavan viestin näyttämiseen, kun SalaryNotInRangeErrorse nostetaan.

Voimme myös mukauttaa itse __str__menetelmän korvaamalla sen.

 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)

Tuotos

 Syötä palkasumma: 2000 jäljitys (viimeisin puhelu viimeisin): Tiedosto "/home/bsoyuj/Desktop/Untitled-1.py", rivi 20, korotuksessa PalaryNotInRangeError (palkka) __main __. SalaryNotInRangeError: 2000 -> Palkka ei ole ( 5000, 15000)

Lisätietoja Pythonin poikkeusten käsittelystä on Python Exception Handling -sivulla.

Mielenkiintoisia artikkeleita...