Исключения в Python и немного о try-except и raise
try-except-finally нужны чтоб отловить возникшую проблему в коде, и как-то ее отработать
Этот механизм называется перехват исключений
Конструкция try работает таким образом:
- сначала выполняются выражения, которые записаны в блоке try
- если при выполнения блока try не возникло никаких исключений, блок except пропускается, и выполняется дальнейший код
- если во время выполнения блока try в каком-то месте возникло исключение, оставшаяся часть блока try пропускается
Обратите внимание, что строка Cool! в блоке try не выводится:
In [4]: try:
...: print("Let's divide some numbers")
...: 2/0
...: print('Cool!')
...: except ZeroDivisionError:
...: print("You can't divide by zero")
...:
Let's divide some numbers
You can't divide by zeroВывести нашу ошибку
В конструкции try/except может быть много except, если нужны разные действия в зависимости от типа ошибки.
Например, скрипт divide.py делит два числа введенных пользователем:
# -*- coding: utf-8 -*-
try:
a = input("Введите первое число: ")
b = input("Введите второе число: ")
print("Результат: ", round(float(a)/float(b), 2))
except ValueError:
print("Пожалуйста, вводите только числа")
except ZeroDivisionError:
print("На ноль делить нельзя")В данном случае исключение ValueError возникает, когда пользователь ввел строку вместо числа, во время перевода строки в число.
Исключение ZeroDivisionError возникает в случае, если второе число было равным 0.
Если нет необходимости выводить различные сообщения на ошибки ValueError и ZeroDivisionError, можно сделать так:
# -*- coding: utf-8 -*-
try:
a = input("Введите первое число: ")
b = input("Введите второе число: ")
print("Результат: ", int(a)/int(b))
except (ValueError, ZeroDivisionError):
print("Что-то пошло не так...")В блоке except можно не указывать конкретное исключение или исключения. В таком случае будут перехватываться все исключения.
raise
raise используем чтобы бросить исключение самостоятельно, при этом можно указать какое конкретно исключение бросить. Если не указать то будет брошено последнее упавшее исключение (важно чтобы оно было!)
Проверяем условие, если что-то неправильно кидаем ошибку
try/except/else
В конструкции try/except есть опциональный блок else. Он выполняется в том случае, если не было исключения.
Например, если необходимо выполнять в дальнейшем какие-то операции с данными, которые ввел пользователь, можно записать их в блоке else
# -*- coding: utf-8 -*-
try:
a = input("Введите первое число: ")
b = input("Введите второе число: ")
result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
print("Что-то пошло не так...")
else:
print("Результат в квадрате: ", result**2)try/except/finally
НО важно понимать, что файналли это не какой то волшебный блок, исключение может упасть и там, нужно обдумывать логику этого блока (например не использовать переменные, которые могли не быть созданы)
Блок finally - это еще один опциональный блок в конструкции try. Он выполняется всегда, независимо от того, было ли исключение или нет.
Сюда ставятся действия, которые надо выполнить в любом случае. Например, это может быть закрытие файла.
Файл divide_ver4.py с блоком finally:
# -*- coding: utf-8 -*-
try:
a = input("Введите первое число: ")
b = input("Введите второе число: ")
result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
print("Что-то пошло не так...")
else:
print("Результат в квадрате: ", result**2)
finally:
print("Вот и сказочке конец, а кто слушал - молодец.")$ python divide_ver4.py Введите первое число: 10 Введите второе число: 2 Результат в квадрате: 25 Вот и сказочке конец, а кто слушал - молодец. $ python divide_ver4.py Введите первое число: qwerewr Введите второе число: 3 Что-то пошло не так... Вот и сказочке конец, а кто слушал - молодец. $ python divide_ver4.py Введите первое число: 4 Введите второе число: 0 Что-то пошло не так... Вот и сказочке конец, а кто слушал - молодец.