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 Exception
luokasta. 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, CustomError
joka periytyy Exception
luokalta. Tämä uusi poikkeus, kuten muutkin poikkeukset, voidaan nostaa käyttämällä raise
lausetta 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.py
tai 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 ( ValueTooSmallError
ja 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 Exception
luokan rakentajan hyväksyäkseen omat mukautetut argumenttimme salary
ja message
. Sitten vanhemman Exception
luokan konstruktori kutsutaan manuaalisesti self.message
argumentin kanssa super()
.
Mukautettu self.salary
määritte on määritelty käytettäväksi myöhemmin.
Luokan perittyä __str__
menetelmää Exception
käytetään sitten vastaavan viestin näyttämiseen, kun SalaryNotInRangeError
se 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.