Исключения
Работа с исключениям это отдельное искусство, освоив которое вы получите инструмент огромного потенциала. Я продемонстрирую несколько методов работы с исключениями в этой главе.
В конечном итоге, нас интересует синтаксис try/except. Код, который может вызвать исключение, помещается в try блок, обработка исключения - в except. Простой пример:
1
try:
2
file = open('test.txt', 'rb')
3
except IOError as e:
4
print('Было вызвано исключение IOError. {}'.format(e.args[-1]))
Copied!
В примере выше мы перехватываем только исключение IOError. Многие новички не знают, что мы можем обрабатывать несколько исключений.

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

Мы можем использовать три метода обработки множества исключений. Первый заключается в создании кортежа из всех возможных исключений. Что-то подобное:
1
try:
2
file = open('test.txt', 'rb')
3
except (IOError, EOFError) as e:
4
print("Было вызвано исключение. {}".format(e.args[-1]))
Copied!
Другой методы заключается в обработке каждого исключения в отдельном блоке except. Мы можем иметь неограниченное их число (но не менее одного). Очередной пример:
1
try:
2
file = open('test.txt', 'rb')
3
except EOFError as e:
4
print("Было вызвано исключение EOFError.")
5
raise e
6
except IOError as e:
7
print("Было вызвано исключение IOError.")
8
raise e
Copied!
Таким образом, если исключение не перехватывается первым блоком except, то оно может быть обработано следующим, или не быть обработанным вовсе. Последний метод заключается в перехвате ВСЕХ исключений:
1
try:
2
file = open('test.txt', 'rb')
3
except Exception:
4
# Логирование, если оно вам требуется
5
raise
Copied!
Это может быть полезно, когда вы не знаете какие исключения могут возникнуть в вашей программе.

finally

Основной код помещается в блок try. Дальше идут блоки except, которые исполняются, если в блоке try было вызвано определённое исключение. Третьим типом блоков, следующим за двумя первыми, может быть finally. Код в блоке finally будет исполнен вне зависимости от того, вызвал ли код в блоке try исключение или нет. Это может быть полезно для финальной "чистки" после работы основного скрипта. Вот простой пример:
1
try:
2
file = open('test.txt', 'rb')
3
except IOError as e:
4
print('Было вызвано исключение IOError. {}'.format(e.args[-1]))
5
finally:
6
print("Я буду напечатан вне зависимости от исключений в блоке try!")
7
8
# Вывод: Было вызвано исключение IOError. No such file or directory
9
# Я буду напечатан вне зависимости от исключений в блоке try!
Copied!

try/else

Иногда мы можем захотеть исполнить определенный код, если исключения не было. Это легко сделать с помощью блока else. Вы можете спросить: почему нам нужен else, если мы можем поместить этот код в блок try? Проблема в том, что исключение в этом коде, может быть в свою очередь поймано try, а мы можем этого и не хотеть. В целом, else нечасто используется, и я, честно говоря, редко к нему прибегаю сам. Пример:
1
try:
2
print('Я уверен, исключений не будет!')
3
except Exception:
4
print('Исключение')
5
else:
6
# Любой код, который должен быть исполнен, если исключение в блоке
7
# try не было вызвано, но для которого не должна проводиться
8
# обработка исключений
9
print('Я буду исполнен, если в try не будет исключений.'
10
'Мои исключения не будут обрабатываться.')
11
finally:
12
print('Я буду исполнен в любом случае!')
13
14
# Вывод: Я уверен, исключений не будет!
15
# Я буду исполнен, если в try не будет исключений. Мои исключения не будут обрабатываться.
16
# Я буду исполнен в любом случае!
Copied!
Блок else, таким образом, исполняется при отсутствии исключений в блоке try. else исполняется перед finally.
Last modified 3yr ago