Найти в Дзене
programmer's notes (python and more)

ООП на Python. Обработка ошибок в Python. Приложение 2 к видео 14

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Теперь в Дзен есть Подборки. Данная статья относится к подборке

ООП в Python
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). С ним в основном и его производными приходится работать.

В программе ниже представлен пример обработки трёх видов ошибок: деления на ноль, ввод данных не правильного формата, переполнение при возведения в степень.

Текст программы см. ниже
Текст программы см. ниже
primer35.py

Варианты исполнения программы:

  • На входе
    3 5
    Результат
    0.6
    243.0
  • На входе
    wer 67
    Результат
    Не правильный типа данных
  • На входе
    23 0
    Результат
    Ошибка деления на ноль
  • На входе
    3 900
    Результат
    0.0033333333333333335
    Ошибка переполнения

Как видим, можно чётко отделить одну ошибку (один тип) от другой. Конечно, можно было бы воспользоваться и стандартными сообщениями от исключения:

Вывод стандартного сообщения исключения
Вывод стандартного сообщения исключения

Создание классов исключений

Но мы сами можем создавать классы ошибок, "бросать" и обрабатывать исключения.

Создать свой класс исключений очень просто. Класс следует унаследовать от Exception или класса наследника Exception. Создадим свой класс обработки для реакции на ввод отрицательного значения стоимости. Пример программы см. ниже.

Текст программы см. ниже
Текст программы см. ниже
primer36.py

Варианты исполнения программы:

  • На входе
    33
    На выходе
    Стоимость 33
  • На входе
    qwerty
    На выходе
    Введен не числовой параметр
  • На входе
    -33
    На выходе
    Ошибка!
    -33
    Параметр должен быть неотрицательным

Сделаем пояснения к программе.

  1. Бросание исключения осуществляется оператором raise.
  2. При выполнении этого оператора создается объект указанного класса.
  3. Если мы хотим передавать параметры, то в классе нужно определить метод __init__. Если этого метода не будет, то будет запущен метод родителя. Так что __init__ в принципе не обязателен.
  4. Если есть необходимость выполнения над объектом функции str(), то следует определить в классе метод __str__ (см. программу) .
  5. Очевидно, что создаваемый класс исключений может и вообще не содержать методов.
  6. В нашем примере, мы используем еще один уже стандартный класс исключений ValueError, который, разумеется, срабатывает автоматически.

Вложенные исключения

Конструкции try - except могут оказаться вложенными. Хотя я бы рекомендовал избегать вложенность, но бывает всякое. Вот пример программы. Вложенность, правда, здесь своеобразная, так как одна структура обработки находится внутри функции, но всё же это вложенность.

Текст программы см. ниже
Текст программы см. ниже
primer37.py

Программу лучше, мне кажется, "покрутить" самому, поэкспериментировать. Сообщения, как видите в той и другой структуре отличаются друг от друга, чтобы понять, где сработал код. Тут важно запомнить, что если сработала обработка исключения внутри, то внешняя обработка работает, как будто ошибки не было. Можно заставить обрабатывать и внешний try, если при обработке исключения внутри вызвать raise без параметров. Ну, надеюсь, вы поэкспериментируете с этой программой.

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Не читайте чужих программ до обеда. Пишите свои
Не читайте чужих программ до обеда. Пишите свои