Python Glossary English

все Python 3Исключенияконструкция

raise

генерация

Генерирует исключение вручную. raise from — цепочка исключений. re-raise — raise без аргументов.

Синтаксис

raise ValueError('msg')
raise RuntimeError('msg') from original

Голый raise допустим только внутри обработчика (иначе RuntimeError: No active exception to re-raise) и сохраняет исходный traceback — привычка писать raise e вместо него лишь добавляет лишний кадр стека. Внутри except Python и так сцепляет исключения сам («During handling of the above exception, another exception occurred»); from нужен, чтобы назвать причину явно, а from None — чтобы спрятать предыдущее исключение из вывода. Бросать можно и класс, и экземпляр: raise ValueError и raise ValueError() равнозначны, класс инстанцируется автоматически.

Примеры

def check_age(age):
    if age < 0:
        raise ValueError(f'Age cannot be negative: {age}')
    return age
try:
    check_age(-1)
except ValueError as e:
    print(e)  # → Age cannot be negative: -1
# raise from
try:
    try:
        int('abc')
    except ValueError as e:
        raise RuntimeError('conversion failed') from e
except RuntimeError as err:
    print(type(err.__cause__).__name__)  # → ValueError — исходная причина сохранена
# Re-raise
def safe():
    try:
        return 1/0
    except ZeroDivisionError:
        print('caught, re-raising')
        raise  # передаёт исходное исключение
try:
    safe()
except ZeroDivisionError:
    print('handled')  # → caught / handled
# raise с кастомным классом
class ValidationError(ValueError):
    pass
def validate(x):
    if x < 0:
        raise ValidationError(f'Invalid value: {x}')
try:
    validate(-5)
except ValidationError as e:
    print(e)  # → Invalid value: -5
# raise без аргументов в except
try:
    try:
        1/0
    except ZeroDivisionError:
        raise  # пробрасываем
except ZeroDivisionError:
    print('outer caught')  # → outer caught
# Цепочка __cause__ и __context__
try:
    raise ValueError('first') from TypeError('cause')
except ValueError as e:
    print(type(e.__cause__).__name__)  # → TypeError

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности