Доброго времени суток, читатели, зрители моего канала programmer's notes.
Теперь в Дзен есть Подборки. Данная статья относится к подборке
Приложение 2 к видеоуроку. Предыдущее приложение здесь
Классы исключений
При обработке исключений в прошлом приложении мы предполагали, что обрабатываться будут все исключения. Но это не всегда удобно. В Python есть целый набор классов, каждый отвечает за группу ошибок.
Список классов исключений представлен ниже. Из списка видно, что базовым классом для всех является BaseException. Классы. являющиеся производными от базового, также также могут порождать другие (дочерние) классы.
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
| +-- StopIteration
| +-- StopAsyncIteration
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- BufferError
| +-- EOFError
| +-- ImportError
| | +-- ModuleNotFoundError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- OSError
| | +-- BlockingIOError
| | +-- ChildProcessError
| | +-- ConnectionError
| | | +-- BrokenPipeError
| | | +-- ConnectionAbortedError
| | | +-- ConnectionRefusedError
| | | +-- ConnectionResetError
| | +-- FileExistsError
| | +-- FileNotFoundError
| | +-- InterruptedError
| | +-- IsADirectoryError
| | +-- NotADirectoryError
| | +-- PermissionError
| | +-- ProcessLookupError
| | +-- TimeoutError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| | +-- RecursionError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| | +-- UnicodeError
| | +-- UnicodeDecodeError
| | +-- UnicodeEncodeError
| | +-- UnicodeTranslateError
| +-- Warning
| +-- DeprecationWarning
| +-- PendingDeprecationWarning
| +-- RuntimeWarning
| +-- SyntaxWarning
| +-- UserWarning
| +-- FutureWarning
| +-- ImportWarning
| +-- UnicodeWarning
| +-- BytesWarning
| +-- ResourceWarning
Мы не даём полного описания списка классов, просто по нежеланию загромождать статью. По названию классов можно чаще всего понять область его применения. Нужную информацию можно получить в Интернете или просто поэкспериментировать с вашей программой, что я постоянно всем рекомендую. Эксперимент — основа программирования!
Отметим только, что класс Exception это базовый класс для всех исключений, не связанных с выходом (exit). С ним в основном и его производными приходится работать.
В программе ниже представлен пример обработки трёх видов ошибок: деления на ноль, ввод данных не правильного формата, переполнение при возведения в степень.
Варианты исполнения программы:
- На входе
3 5
Результат
0.6
243.0 - На входе
wer 67
Результат
Не правильный типа данных - На входе
23 0
Результат
Ошибка деления на ноль - На входе
3 900
Результат
0.0033333333333333335
Ошибка переполнения
Как видим, можно чётко отделить одну ошибку (один тип) от другой. Конечно, можно было бы воспользоваться и стандартными сообщениями от исключения:
Создание классов исключений
Но мы сами можем создавать классы ошибок, "бросать" и обрабатывать исключения.
Создать свой класс исключений очень просто. Класс следует унаследовать от Exception или класса наследника Exception. Создадим свой класс обработки для реакции на ввод отрицательного значения стоимости. Пример программы см. ниже.
Варианты исполнения программы:
- На входе
33
На выходе
Стоимость 33 - На входе
qwerty
На выходе
Введен не числовой параметр - На входе
-33
На выходе
Ошибка!
-33
Параметр должен быть неотрицательным
Сделаем пояснения к программе.
- Бросание исключения осуществляется оператором raise.
- При выполнении этого оператора создается объект указанного класса.
- Если мы хотим передавать параметры, то в классе нужно определить метод __init__. Если этого метода не будет, то будет запущен метод родителя. Так что __init__ в принципе не обязателен.
- Если есть необходимость выполнения над объектом функции str(), то следует определить в классе метод __str__ (см. программу) .
- Очевидно, что создаваемый класс исключений может и вообще не содержать методов.
- В нашем примере, мы используем еще один уже стандартный класс исключений ValueError, который, разумеется, срабатывает автоматически.
Вложенные исключения
Конструкции try - except могут оказаться вложенными. Хотя я бы рекомендовал избегать вложенность, но бывает всякое. Вот пример программы. Вложенность, правда, здесь своеобразная, так как одна структура обработки находится внутри функции, но всё же это вложенность.
Программу лучше, мне кажется, "покрутить" самому, поэкспериментировать. Сообщения, как видите в той и другой структуре отличаются друг от друга, чтобы понять, где сработал код. Тут важно запомнить, что если сработала обработка исключения внутри, то внешняя обработка работает, как будто ошибки не было. Можно заставить обрабатывать и внешний try, если при обработке исключения внутри вызвать raise без параметров. Ну, надеюсь, вы поэкспериментируете с этой программой.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.