Как мы помним: исключения - это код, который выполняется когда происходит ошибка. И названия исключений прописаны в документации.
Но можно писать и собственные исключения.
Допустим мы хотим, чтобы list позволял добавить только четные числа. Для начала требуется написать класс исключения. Напишем, например, по смыслу - NonEvenError.
NonEvenError будет бросаться при попытке добавить в list нечётное число:
Он унаследован от класса Exception и больше ничего от него не требуется, поэтому стоит заглушка - pass.
Далее требуется переопределить класс List, для этого напишем класс EvenList:
Здесь мы также наследуем, но уже от List-а. Так как мы хотели, чтобы исключение срабатывало при добавлении элементов, то переопределим метод append.
Пишем обычный if проверки на чётность и в его теле прописываем ключевое слово super. Super - означает, что мы используем метод из наследуемого класса List, то есть append с аргументом x.
Иначе бросаем наше исключение, с помощью команды raise. Также не забываем передать в исключение аргумент.
Теперь всё готово, чтобы проверить работу нашего собственного исключения. Создадим объект класса EvenList и попытаемся добавить в него нечетное число:
При запуске увидим ошибку:
__main__.NonEvenError: 3
То есть программа прервалась с нашей собственной ошибкой и был передан аргумент, который её вызвал.
Это исключение также можно обработать обработчиком исключений. Нет никакой разницы между стандартными исключениями и исключениями, которые были написаны собственноручно.