Як визначити власні винятки в Python? (З прикладами)

У цьому підручнику ви дізнаєтесь, як за допомогою прикладів визначати власні винятки залежно від ваших вимог.

Python має безліч вбудованих винятків, які змушують програму видавати помилку, коли щось у програмі йде не так.

Однак іноді вам може знадобитися створити власні винятки, які відповідають вашій меті.

Створення спеціальних винятків

У Python користувачі можуть визначати власні винятки, створюючи новий клас. Цей клас винятків повинен бути отриманий, прямо чи опосередковано, із вбудованого Exceptionкласу. Більшість вбудованих винятків також походять з цього класу.

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

Тут ми створили визначений користувачем виняток із назвою, CustomErrorякий успадковується від Exceptionкласу. Цей новий виняток, як і інші винятки, можна викликати за допомогою raiseоператора із необов’язковим повідомленням про помилку.

Коли ми розробляємо велику програму Python, гарною практикою є розміщення всіх визначених користувачем винятків, які наша програма створює, в окремий файл. Це роблять багато стандартних модулів. Вони визначають свої винятки окремо як exceptions.pyабо errors.py(загалом, але не завжди).

Визначений користувачем клас винятків може реалізувати все, що може зробити звичайний клас, але ми, як правило, робимо їх простими та стислими. Більшість реалізацій оголошують власний базовий клас і отримують інші класи винятків з цього базового класу. Ця концепція стає зрозумілішою у наступному прикладі.

Приклад: Визначений користувачем виняток у Python

У цьому прикладі ми проілюструємо, як визначені користувачем винятки можуть бути використані в програмі для виявлення та виявлення помилок.

Ця програма попросить користувача ввести номер, доки він правильно не вгадає збережений номер. Щоб допомогти їм це зрозуміти, надається підказка, чи більша чи менша їх здогадка, ніж збережена цифра.

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

Ось зразок запуску цієї програми.

Введіть число: 12 Це значення завелике, спробуйте ще раз! Введіть число: 0 Це значення замале, спробуйте ще раз! Введіть число: 8 Це значення замале, спробуйте ще раз! Введіть число: 10 Вітаємо! Ви правильно вгадали.

Ми визначили базовий клас з назвою Error.

Два інших винятки ( ValueTooSmallErrorі ValueTooLargeError), які насправді викликані нашою програмою, походять з цього класу. Це стандартний спосіб визначення визначених користувачем винятків у програмуванні на Python, але ви не обмежуєтесь цим способом.

Налаштування класів винятків

Ми можемо додатково налаштувати цей клас, щоб приймати інші аргументи відповідно до наших потреб.

Щоб дізнатись про налаштування класів винятків, потрібно мати базові знання об’єктно-орієнтованого програмування.

Відвідайте об’єктно-орієнтоване програмування Python, щоб розпочати вивчення об’єктно-орієнтованого програмування на Python.

Давайте розглянемо один приклад:

 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)

Вихідні дані

 Введіть суму заробітної плати: 2000 Traceback (останній дзвінок останній): Файл "", рядок 17, у підвищенні SalaryNotInRangeError (зарплата) __основна __. SalaryNotInRangeError: Зарплата не в діапазоні (5000, 15000)

Тут ми перевизначили конструктор Exceptionкласу, щоб прийняти наші власні власні аргументи salaryта message. Потім конструктор батьківського Exceptionкласу викликається вручну з використанням self.messageаргументу super().

Спеціальний self.salaryатрибут визначений для подальшого використання.

Потім успадкований __str__метод Exceptionкласу використовується для відображення відповідного повідомлення при SalaryNotInRangeErrorпіднятті.

Ми також можемо налаштувати сам __str__метод, замінивши його.

 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)

Вихідні дані

 Введіть суму заробітної плати: 2000 Traceback (останній дзвінок останній): Файл "/home/bsoyuj/Desktop/Untitled-1.py", рядок 20, для підвищення SalaryNotInRangeError (зарплата) __основна __. SalaryNotInRangeError: 2000 -> Зарплата не в ( 5000, 15000) діапазон

Щоб дізнатися більше про те, як можна обробляти винятки в Python, відвідайте Python Exception Handling.

Цікаві статті...