Ми вже знаємо про різні винятки в Python і про те, чому важливо обробляти винятки. Однак іноді може знадобитися створити свої власні винятки.
Визначення користувацьких винятків
В Python ми можемо визначити користувацькі винятки, створивши новий клас, який буде дочірнім вбудованому класу Exception.
Синтаксис для визначення користувацьких винятків у Python:
|
1 2 3 4 5 6 7 8 9 |
class CustomError(Exception): ... pass try: ... except CustomError: ... |
Тут CustomError – це визначена користувачем помилка, яка наслідується від класу Exception.
Примітка:
При розробці великих проектів, гарною практикою є розміщення всіх користувацьких винятків в окремому файлі.
Багато стандартних модулів визначають свої власні винятки окремо як exceptions.py або errors.py (зазвичай, але не завжди).
Розглянемо приклад використання користувацького винятку в Python:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Визначаємо користувацький виняток class InvalidAgeException(Exception): "Raised when the input value is less than 18" pass # Потрібно вгадати це число number = 18 try: input_num = int(input("Enter a number: ")) if input_num < number: raise InvalidAgeException else: print("Eligible to Vote") except InvalidAgeException: print("Exception occurred: Invalid Age") |
Результат:
Якщо введене користувачем значення input_num більше 18:
Enter a number: 45
Eligible to Vote
Якщо введене користувачем значення input_num менше 18:
Enter a number: 14
Exception occurred: Invalid Age
Тут ми визначили користувацький виняток InvalidAgeException, створивши новий клас, який є дочірнім класу Exception. Коли значення Input_num менше 18, генерується виняток. Коли виникає виняток, решта коду всередині блоку try пропускається.
Блок except перехоплює наш користувацький виняток InvalidAgeException, та виконується код всередині блоку except.
Кастомізація класів винятків
Щоб дізнатися про налаштування (кастомізацію) класів винятків, необхідно мати базові знання про об’єктно-орієнтоване програмування. Наприклад::
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class SalaryNotInRangeError(Exception): """Виняток, викликаний помилками у вхідному значенні salary Атрибути: salary -- значення salary, яке викликало помилку message -- пояснення помилки """ 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) |
Результат:
Enter salary amount: 2000
Traceback (most recent call last):
File "<string>", line 17, in <module>
raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Тут ми перевизначили конструктор класу Exception, щоб він приймав наші власні користувацькі аргументи salary та message.
Потім конструктор батьківського класу Exception викликається вручну з аргументом self.message за допомогою методу super(). Користувацький атрибут self.salary визначається для подальшого використання.

(9 оцінок, середня: 4,78 з 5)