W tym samouczku dowiesz się, jak definiować niestandardowe wyjątki w zależności od wymagań, korzystając z przykładów.
Python ma wiele wbudowanych wyjątków, które wymuszają na programie wyświetlenie błędu, gdy coś w programie pójdzie nie tak.
Jednak czasami może być konieczne utworzenie własnych niestandardowych wyjątków, które służą do Twojego celu.
Tworzenie wyjątków niestandardowych
W Pythonie użytkownicy mogą definiować niestandardowe wyjątki, tworząc nową klasę. Ta klasa wyjątku musi zostać wyprowadzona bezpośrednio lub pośrednio z Exception
klasy wbudowanej . Większość wbudowanych wyjątków również pochodzi z tej klasy.
>>> 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
Tutaj utworzyliśmy wyjątek zdefiniowany przez użytkownika o nazwie, CustomError
który dziedziczy po Exception
klasie. Ten nowy wyjątek, podobnie jak inne wyjątki, można zgłosić za pomocą raise
instrukcji z opcjonalnym komunikatem o błędzie.
Kiedy tworzymy duży program w Pythonie, dobrą praktyką jest umieszczenie wszystkich wyjątków zdefiniowanych przez użytkownika, które zgłasza nasz program, w oddzielnym pliku. Robi to wiele standardowych modułów. Swoje wyjątki definiują oddzielnie jako exceptions.py
lub errors.py
(zazwyczaj, ale nie zawsze).
Klasa wyjątków zdefiniowana przez użytkownika może zaimplementować wszystko, co może zrobić normalna klasa, ale generalnie upraszczamy i zwięzle. Większość implementacji deklaruje niestandardową klasę bazową i wyprowadza inne klasy wyjątków z tej klasy bazowej. Poniższy przykład wyjaśnia tę koncepcję.
Przykład: wyjątek zdefiniowany przez użytkownika w Pythonie
W tym przykładzie zilustrujemy, jak wyjątki zdefiniowane przez użytkownika mogą być używane w programie do zgłaszania i wychwytywania błędów.
Ten program poprosi użytkownika o wprowadzenie liczby, dopóki nie odgadną prawidłowo zapisanej liczby. Aby pomóc im to rozgryźć, pojawia się podpowiedź, czy ich przypuszczenie jest większe, czy mniejsze od zapisanej liczby.
# 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.")
Oto przykładowe uruchomienie tego programu.
Wpisz liczbę: 12 Ta wartość jest za duża, spróbuj ponownie! Wpisz liczbę: 0 Ta wartość jest za mała, spróbuj ponownie! Wpisz liczbę: 8 Ta wartość jest za mała, spróbuj ponownie! Wpisz liczbę: 10 Gratulacje! Zgadłeś poprawnie.
Zdefiniowaliśmy klasę bazową o nazwie Error
.
Pozostałe dwa wyjątki ( ValueTooSmallError
i ValueTooLargeError
), które są faktycznie zgłaszane przez nasz program, pochodzą z tej klasy. Jest to standardowy sposób definiowania wyjątków zdefiniowanych przez użytkownika w programowaniu w Pythonie, ale nie jesteś ograniczony tylko do tego.
Dostosowywanie klas wyjątków
Możemy dodatkowo dostosować tę klasę, aby akceptowała inne argumenty zgodnie z naszymi potrzebami.
Aby dowiedzieć się o dostosowywaniu klas Exception, musisz mieć podstawową wiedzę na temat programowania obiektowego.
Odwiedź Python Object Oriented Programming, aby rozpocząć naukę programowania obiektowego w Pythonie.
Spójrzmy na jeden przykład:
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)
Wynik
Wprowadź kwotę wynagrodzenia: 2000 Traceback (ostatnia rozmowa): Plik „”, wiersz 17, w podniesieniu SalaryNotInRangeError (wynagrodzenie) __main __. SalaryNotInRangeError: Salary nie mieści się w zakresie (5000, 15000)
W tym miejscu nadpisaliśmy konstruktora Exception
klasy, aby zaakceptował nasze własne argumenty niestandardowe salary
i message
. Następnie konstruktor Exception
klasy nadrzędnej jest wywoływany ręcznie z self.message
argumentem using super()
.
self.salary
Atrybut niestandardowy jest zdefiniowany do późniejszego użycia.
Dziedziczona __str__
metoda Exception
klasy jest następnie używana do wyświetlania odpowiedniego komunikatu, gdy SalaryNotInRangeError
zostanie podniesiony.
Możemy również dostosować __str__
samą metodę, zastępując ją.
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)
Wynik
Wpisz kwotę wynagrodzenia: 2000 Traceback (ostatnia rozmowa): Plik "/home/bsoyuj/Desktop/Untitled-1.py", wiersz 20, w podniesieniu SalaryNotInRangeError (salary) __main __. SalaryNotInRangeError: 2000 -> Salary is not in ( 5000, 15000)
Aby dowiedzieć się więcej o tym, jak obsługiwać wyjątki w języku Python, odwiedź stronę Obsługa wyjątków w języku Python.