Блог

Исключения в Python. Операторы вызова исключений: raise и assert

Это продолжение статьи Исключения в Python. Введение

Оператор raise

Бывают ситуации, когда формально ошибки нет, но переменная принимает такое значение, при котором программа может дать результат, очень далёкий от ожидания. И тогда мы можем вызвать ошибку принудительно, с помощью оператора 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

Ещё одна возможность принудительно вызвать ошибку, в случае невыполнения указанного условия — с помощью оператора 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 выглядит самую малость предпочтительней, так как:

  1. assert не требует отдельного блока if — условие проверки с этим оператором делается в одну строку;
  2. В случае assert не требуется указывать класс исключения — по умолчанию это всегда AssertionError

Вернуться в начало, на статью Исключения в Python. Введение