In deze zelfstudie leert u met behulp van voorbeelden hoe u aangepaste uitzonderingen kunt definiëren, afhankelijk van uw vereisten.
Python heeft talloze ingebouwde uitzonderingen die je programma dwingen een foutmelding te geven als er iets in het programma fout gaat.
Soms moet u echter uw eigen aangepaste uitzonderingen maken die aan uw doel dienen.
Aangepaste uitzonderingen maken
In Python kunnen gebruikers aangepaste uitzonderingen definiëren door een nieuwe klasse te maken. Deze uitzonderingsklasse moet, direct of indirect, worden afgeleid van de ingebouwde Exception
klasse. De meeste ingebouwde uitzonderingen zijn ook afgeleid van deze klasse.
>>> 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
Hier hebben we een door de gebruiker gedefinieerde uitzondering gemaakt met de naam CustomError
die erft van de Exception
klasse. Deze nieuwe uitzondering kan, net als andere uitzonderingen, worden opgeworpen met behulp van de raise
instructie met een optioneel foutbericht.
Wanneer we een groot Python-programma ontwikkelen, is het een goede gewoonte om alle door de gebruiker gedefinieerde uitzonderingen die ons programma oproept in een apart bestand te plaatsen. Veel standaardmodules doen dit. Ze definiëren hun uitzonderingen afzonderlijk als exceptions.py
of errors.py
(in het algemeen maar niet altijd).
Door de gebruiker gedefinieerde uitzonderingsklassen kunnen alles implementeren wat een normale klasse kan, maar we maken ze over het algemeen eenvoudig en beknopt. De meeste implementaties declareren een aangepaste basisklasse en leiden andere uitzonderingsklassen af van deze basisklasse. Dit concept wordt duidelijker gemaakt in het volgende voorbeeld.
Voorbeeld: door de gebruiker gedefinieerde uitzondering in Python
In dit voorbeeld laten we zien hoe door de gebruiker gedefinieerde uitzonderingen in een programma kunnen worden gebruikt om fouten op te sporen en op te sporen.
Dit programma zal de gebruiker vragen om een nummer in te voeren totdat ze een opgeslagen nummer correct raden. Om ze te helpen erachter te komen, wordt een hint gegeven of hun gok groter of kleiner is dan het opgeslagen getal.
# 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.")
Hier is een voorbeeld van een run van dit programma.
Voer een getal in: 12 Deze waarde is te hoog, probeer het opnieuw! Voer een getal in: 0 Deze waarde is te klein, probeer het opnieuw! Voer een getal in: 8 Deze waarde is te klein, probeer het opnieuw! Voer een getal in: 10 Gefeliciteerd! Je raadt het goed.
We hebben een basisklasse gedefinieerd met de naam Error
.
De andere twee uitzonderingen ( ValueTooSmallError
en ValueTooLargeError
) die feitelijk door ons programma worden opgeworpen, zijn afgeleid van deze klasse. Dit is de standaardmanier om door de gebruiker gedefinieerde uitzonderingen in Python-programmering te definiëren, maar u bent niet alleen op deze manier beperkt.
Uitzonderingsklassen aanpassen
We kunnen deze klasse verder aanpassen om andere argumenten te accepteren volgens onze behoeften.
Om te leren over het aanpassen van de Exception-klassen, moet u de basiskennis van Objectgeoriënteerd programmeren hebben.
Bezoek Python Object Oriented Programming om te leren over Object-Oriented Programming in Python.
Laten we naar een voorbeeld kijken:
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)
Uitvoer
Voer het salarisbedrag in: 2000 Traceback (meest recente oproep laatste): Bestand "", regel 17, in loonsverhoging SalaryNotInRangeError (salaris) __main __. SalaryNotInRangeError: Salaris valt niet binnen het bereik van (5000, 15000)
Hier hebben we de constructor van de Exception
klasse overschreven om onze eigen aangepaste argumenten te accepteren salary
en message
. Vervolgens wordt de constructor van de bovenliggende Exception
klasse handmatig aangeroepen met het self.message
argument met super()
.
Het aangepaste self.salary
kenmerk is gedefinieerd om later te worden gebruikt.
De overgeërfde __str__
methode van de Exception
klasse wordt vervolgens gebruikt om het corresponderende bericht weer te geven wanneer SalaryNotInRangeError
wordt opgeworpen.
We kunnen de __str__
methode zelf ook aanpassen door deze te overschrijven.
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)
Uitvoer
Voer het salarisbedrag in: 2000 Traceback (meest recente oproep laatste): Bestand "/home/bsoyuj/Desktop/Untitled-1.py", regel 20, in salaris verhogen SalaryNotInRangeError (salaris) __main __. SalaryNotInRangeError: 2000 -> Salaris is niet in ( 5000, 15000) bereik
Ga naar Python Exception Handling voor meer informatie over het omgaan met uitzonderingen in Python.