все 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Сообщить о неточности