Это продолжение статьи Исключения в Python. Введение
Бывают ситуации, когда формально ошибки нет, но переменная принимает такое значение, при котором программа может дать результат, очень далёкий от ожидания. И тогда мы можем вызвать ошибку принудительно, с помощью оператора raise:
try:
value = int(input())
if value % 2 != 0:
raise ValueError('Variable <value> must be even!')
print('Congratulations! Variable <value> is even!')
except Exception as e:
print(f'{e.__class__}: {e}')
В приведённом примере исключение будет вызвано в том случае, когда целое число не является чётным, то есть в случае выполнения условия if value % 2 != 0:
Для этого после оператора raise указывается класс исключения (в данном случае это ValueError), к которому будет отнесена соответствующая группа значений переменной value. А далее, в скобках, добавлен комментарий, поясняющий причину вызова исключения. Ниже приводятся результаты выполнения кода для значений 4 и 5:
>>>
5
<class 'ValueError'>: Variable <value> must be even!
4
'Congratulations! Variable <value> is even!'
Если появится другая ошибка, например, если с консоли будет введено значение aaa, то программа перейдёт на обработку этого исключения ещё до оператора raise. И, разумеется, выдаст совершенно другой код ошибки (точнее, выдаст другой комментарий ошибки к общему классу исключений ValueError):
>>>
aaa
<class 'ValueError'>: invalid literal for int() with base 10: 'aaa'
Ещё одна возможность принудительно вызвать ошибку, в случае невыполнения указанного условия — с помощью оператора assert:
try:
value = int(input())
assert value % 2 == 0, 'Variable <value> must be even!'
print('Congratulations! Variable <value> is even!')
except Exception as e:
print(f'{e.__class__}: {e}')
Варианты выполнения кода для различных входных значений:
>>>
5
<class 'AssertionError'>: 'Variable <value> must be even!
4
'Congratulations! Variable <value> is even!'
aaa
<class 'ValueError'>: invalid literal for int() with base 10: 'aaa'
Таким образом, как видим, оба оператора (raise и assert) очень похожи друг на друга.
Разве что вариант с assert выглядит самую малость предпочтительней, так как: