Короткий ответ
Да, создавать собственные исключения можно и часто нужно: достаточно объявить класс, наследующий от Exception или его подкласса, и возбуждать его оператором raise. Это позволяет сообщать об ошибках, специфичных для приложения, и обрабатывать их отдельно от стандартных.
Как это работает подробнее
Процесс состоит из трёх шагов: определить класс исключения, бросить его при особом условии и перехватить в try/except.
- Определение класса. Новый класс наследуется от встроенного
Exceptionили подходящего подкласса вродеValueErrorилиRuntimeError. - Соглашение об именах. Имена классов исключений принято заканчивать словом
Error. - Оператор raise. Исключение возбуждается в момент наступления особого условия и затем перехватывается в
try/except. - Дополнительные данные. Переопределением
__init__()и__str__()можно хранить значение, вызвавшее ошибку, и формировать читаемое сообщение.
Пример кода
Исключение для проверки возраста
class InvalidAgeError(Exception):
def __init__(self, age, message='Возраст должен быть в диапазоне 0–120'):
self.age = age
self.message = message
super().__init__(message)
def __str__(self):
return f'{self.age} -> {self.message}'
def set_age(age):
if age < 0 or age > 120:
raise InvalidAgeError(age)
print(f'Возраст установлен: {age}')
try:
set_age(150)
except InvalidAgeError as e:
print(e) # 150 -> Возраст должен быть в диапазоне 0–120Что использовать на практике
- Точность обработки. Лови собственные исключения отдельно от стандартных, чтобы ветка реакции была однозначной.