Найти в Дзене
Old Programmer

Программирование на Python. Обработка исключений (try, except, finally). Статья 2

На моем канале Old Programmer много статей и роликов о программировании, здесь вы найдете ссылки на все мои материалы. А здесь все мои материалы по языку программирования Python. Материал, который мы сегодня рассматриваем является продолжением материала статьи: Иерархия исключений в языке Python Продолжим заниматься исключениями. В python встроено большое количество разных исключений. Их можно представить в виде иерархии (см. ниже). 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
Оглавление

На моем канале Old Programmer много статей и роликов о программировании, здесь вы найдете ссылки на все мои материалы. А здесь все мои материалы по языку программирования Python.

  • Список разделов канала Old Programmer, канала о программировании и программистах

Материал, который мы сегодня рассматриваем является продолжением материала статьи:

  • Язык Python. Обработка исключений (try, except, finally). Статья 1
  • Обработка критических ситуаций в языках программирования. Обзор ресурсов

Иерархия исключений в языке Python

Продолжим заниматься исключениями. В python встроено большое количество разных исключений. Их можно представить в виде иерархии (см. ниже).

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

Представленная иерархия, это иерархия классов, которые можно наследовать, т.е. в сущности создавать свои собственные обработчики исключений.

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

  • Собственно произвести обработку.
  • Попытаться определить, что конкретно вызвало исключение.

Представленная выше иерархия и решает баланс двух указанных задач. Суть в том, что можно использовать исключения с большим диапазоном включенных в него других исключений. Вы гарантируете, таким образом, что практически любая ошибка будет отловлена. Но с другой стороны, для вас не до конца (или совсем) не будет ясно, что вызвало исключение. Таким образом дальнейшее поведение программы будет только общей реакцией на ошибку. Но можно спуститься вниз по иерархии и обработать все исключения или часть из них, которые по вашим соображениям могут произойти. Вы тем самым усложните текст программы. В этом случае нужно найти некий баланс и конкретизировать только важные для вас исключения, а остальные обработать исключением более высокого ранга. Рассмотрим программу try4002.py из статьи

Язык Python. Обработка исключений (try, except, finally). Статья 1

Нам не хотелось отдельно обрабатывать все возможные файловые исключения и мы выбрали исключение OSError. Т.е. любая не корректная ситуация, связанная с открытием файла будет здесь обработана. Все остальные ситуации мы обрабатываем с помощью Exception. Хотя можно было использовать сразу Exception, но тогда бы оставалась не ясность, что произошло.

Использование finally при обработке исключений в Python

Если при обработке исключений нужно выполнить код, который должен выполниться в любом случае, но после попытки выполнения блока команд, которые могут вызвать исключения, то используется блок finally. Чтобы подчеркнуть безальтернативность данного утверждения рассмотрим следующую программу (try4003.py). Заметьте, что в блоках, где обрабатываются исключения стоят операторы выхода из программы. Но все равно, прежде чем выйти python обработает блок finally. Разумеется блок finally будет выполнен и в случае, если исключения не будет.

Пока все, продолжим разговор об исключениях в следующей статье.

Подписывайтесь на мой канал Old Programmer и увлекаемся программированием. Пока!

Программа try4003.py
Программа try4003.py