Try Except в Python

В Python есть особый тип данных, который используется, чтобы сообщить разработчику об ошибках в ходе исполнения программы. Называется он исключениями. Самый простой пример – это деление на ноль. Когда программист попробует ввести выражение, где какое-то число разделяется на ноль, то выдаются следующие строки.

>>> 100 / 0

Traceback (most recent call last):

  File "", line 1, in

    100 / 0

ZeroDivisionError: division by zero

Давайте детальнее разберем это сообщение. С его помощью нам Python говорит, что появилась ошибка. И передал сведения о ней – Traceback (most recent call last). Затем следует имя файла, в котором произошла проблема. В нашем случае его нет, поскольку мы вводили команды в интерактивном режиме. Далее указывается строка, в которой произошла ошибка, в нашем случае –  line 1

Затем следует выражение, при исполнении которого возникла проблема – 100/0.

И, в конечном итоге, пишется название проблемы (ZeroDivisionError) и описание проблемы – division by zero (деление на ноль, в переводе).

Конечно, ошибки бывают разными. Например, такие. 

>>> 2 + '1'

Traceback (most recent call last):

  File "", line 1, in

    2 + '1'

TypeError: unsupported operand type(s) for +: 'int' and 'str'




>>> int('qwerty')

Traceback (most recent call last):

  File "", line 1, in

    int('qwerty')

ValueError: invalid literal for int() with base 10: 'qwerty'

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

Python имеет встроенную иерархическую структуру ошибок. Впрочем, могут быть и другие. Дело в том, что у разработчиков есть возможность создавать собственные. 

Иерархия 

Все ошибки в Python выстроены в иерархическом порядке. Рассмотрим эту структуру подробнее:

1. BaseException. Это основная ошибка, к которой относятся все остальные.

a. SystemExit. Оно появляется тогда, когда происходит выход из приложения.

b. KeyboardInterrupt. Если исполнение приложения прерывается человеком, который им пользуется, то вызывается эта ошибка. Как правило, это происходит, когда он нажимает комбинацию клавиш Ctrl + C.

c. GeneratorExit. Если происходит вызов метода close генератора, то выдается эта ошибка.

d. Exception. Это категория исключений, не являющихся системными. С теми лучше ничего не делать, а вот с исключениями типа Exception уже вполне возможно что-то делать.

i. StopIteration. Если итератор больше не содержит данных, то вызывается это исключение. Оно появляется в результате работы встроенной функции next.

ii. ArithmeticError. Это арифметическое исключение, которое также может иметь несколько разновидностей.

1. FloatingPointError. Если происходит исключение при исполнении операций с числами типа Float, то выходит такая проблема. Но данное исключение довольно редкое.

2. OverflowError. Если результат арифметической операции чрезмерно большой, то тогда происходит эта ошибка. При привычной работе с целочисленными значениями данного исключения не происходит (дело в том, что Python имеет поддержку длинных чисел), но в ряде иных ситуаций вполне возможно ее возникновение.

3. ZeroDivisionError. Эта проблема рассматривалась ранее. Она появляется, когда происходит попытка деления на ноль.

iii. AssertionError. Если выражение функции assert не является истинным.

iv. AttributeError. Если у объекта отсутствует данный атрибут, в качестве которого может выступать не только значение, но и метод.

v. BufferError. Если не получается выполнить операцию, связанную с буфером.

vi. EOFError. Если при исполнении функции получилось наткнуться на конец документа, и в результате не получилось определить его содержимое.

vii. ImportError. Неудача при попытке импортировать модуль или его атрибут.

viii. LookupError. Был указан отсутствующий или не входящий в диапазон «ключ или индекс».

1. IndexError. Индекс не включен в диапазон значений.

2. KeyError. Такого ключа или индекса вообще нет в итерируемом объекте.

ix. MemoryError. Отсутствие достаточного количества памяти.

x. NameError. Не удалось найти переменную с данным именем.

1. UnboundLocalError. Есть ссылка, которая не была предварительно определена.

xi. OSError. Категория ошибок, связанная с ОС.

1. BlockingIOError.

2. ChildProcessError – сигнализирует об ошибки при совершении операций с дочерним процессом.

3. ConnectionError. Это категория ошибок, которая свидетельствует о проблемах с подключением.

a. BrokenPipeError

b. ConnectionAbortedError

c. ConnectionRefusedError

d. ConnectionResetError

4. FileExistsError. Ошибка появляется тогда, когда совершается попытка создать файл или папку, которые уже существуют в данной директории.

5. FileNotFoundError. Возникает, когда не получается найти указанную папку или файл.

6. InterruptedError. Прерывание входящим сигналом системного вызова.

7. IsADirectoryError. Программа хотела работать с файлом, а попала на директорию.

8. NotADirectoryError. Обратная ситуация: приложение хотело работать с папкой, а оказалось, что это – файл.

9. PermissionError. Ошибка, связанная с недостатком прав доступа.

10. ProcessLookupError – процесс, который указан, не существует.

11. TimeoutError. Окончание времени ожидания.

xii. RefferenceError. Не выходит получить доступ к атрибуту со слабой ссылкой.

xiii. RuntimeError. Если исключение не попадает ни под одну из категорий, вызывается данная ошибка.

xiv. NotImplementedError – появляется, когда абстрактные методы класса нуждаются в переопределении в дочерних классах.

xv. SyntaxError – категория синтаксических ошибок.

1. IndentationError. Несоблюдение правил отступов.

2. TabError. Табуляция и пробелы смешиваются в отступах.

xvi. SystemError – внутренняя системная ошибка.

xvii. TypeError – операция применена к объекту того типа, к которому она не может быть применена.

xviii. ValueError – функция получает аргумент правильного типа, но неправильного значения.

xix. UnicodeError. Эта ошибка связана с кодированием и раскодированием Unicode в строках.

1. UnicodeEncodeError – ошибка, связанная с кодированием.

2. UnicodeDecodeError – ошибка, связанная с декодированием.

3. UnicodeTranslateError – ошибка, вызванная проблемами с переводом Unicode.

xx. Warning – предупреждение.

Обработка исключений

Теперь, когда вы знаете, какими бывают ошибки в Python, необходимо научиться их обрабатывать. Что такое обработка исключений? Это последовательность действий, которая будет выполняться, если возникает та или иная ошибка. 

Для этого используется блок try .. except, который содержит три компонента:

  1. try – проверяет, есть ли ошибки при исполнении кода.
  2. except – осуществляет непосредственную обработку ошибок.
  3. finally – выполняет код, независимо от того, была ли ошибка и как она была обработана.

Когда появляется исключение, Python, как правило, останавливает выполнение программы с сообщением об ошибке.

Чтобы этого не допустить, используется оператор try.

Приведем пример, в котором он генерирует исключение, поскольку x не объявлен. 

try:

    print(x)

except:

    print("Ошибка")

После того, как будет исполнен этот код, блок try определяет ошибку, а блок except обрабатывает ее. Если же не использовать этот блок, то программа будет попросту остановлена с выдачей информации об ошибке. 

print(x)

Вывод:

Traceback (most recent call last):

  File "<pyshell#2>", line 1, in <module>

    x

NameError: name 'x' is not defined

Обработка нескольких исключений

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

try:

    print(x)

except NameError:

    print("Переменная x не существует")

except:

    print("Что-то пошло не так")

Вывод:




Переменная x не существует

Здесь сначала происходит обработка ошибки NameError, а потом – все остальные ошибки. Во втором случае выдается информация «Что-то пошло не так». Так можно обрабатывать ошибки, тип которых не является значимым в определенный момент.

Else

Если требуется обозначить блок инструкций, который должен выполняться при отсутствии ошибок, используется ключевое слово else

try:  

    print("Привет")  

except:  

    print("Что-то пошло не так")  

else:  

    print("Ошибок не обнаружено")

Вывод:




Привет

Ошибок не обнаружено

Finally

Блок Finally выполняется вне зависимости от того, появляется ли ошибка в блоке try, или нет. 

try:

    print(x)

except:

    print("Что-то пошло не так")

finally:

    print("Блок 'try except' завершен")

Вывод:




Что-то пошло не так

Блок 'try except' завершен

Это бывает нужно, когда необходимо закрыть файлы и очистить ресурсы. Давайте попробуем поработать с файлом, записав в него информацию. Нюанс – наш файл будет недоступным для записи.

В этом случае надо использовать следующий код. 

try:

    f = open("demofile.txt") # фал должен быть создан, иначе исключение FileNotFound

    f.write("Lorem Ipsum")

except: 

    print("Что-то пошло не так при записи в файл")

finally:

    f.close()

Вывод:

Что-то пошло не так при записи в файл

В этом случае при возникновении ошибки программа будет продолжать работать и просто закроет файл.

Выводы

Таким образом, обработка ошибок – очень простая процедура. Гораздо сложнее их на практике обнаружить. Но без исключений невозможно программирование. Всегда будет что-то в прописанном пользователем алгоритме идти не так. Для определения ошибок в коде даже нанимается команда тестировщиков, которая специально занимается определением неполадок.

Но благодаря обработке ошибок можно обеспечить стабильность приложения даже, если случай очень проблемный. Если же возникновение какой-то ошибки можно предусмотреть (например, деление на ноль в калькуляторе), то можно указать конкретный тип исключения, и настроить последовательность действий, выполняемых программой при этом.

ОфисГуру
Adblock
detector