raise
Возбуждает указанное исключение.
Инструкция позволяет прервать штатный поток исполнения при помощи возбуждения исключения.
Если после инструкции отсутствует выражение (например, не указывается тип исключения), то повторно поднимается отловленное исключение. Если в данной области нет активного исключения (например,
Если выражение присутствует, то результатом его вычисления должен являться либо экземпляр наследника BaseException, либо сам наследник, то есть тип. Во втором случае объект исключения будет сформирован путём инстанциирования типа без аргументов.
Объект трассировки
Объект трассировки обычно создаётся автоматически при возбуждении исключения и подвязывается к нему в атрибут
Цепочки исключений
Для формирования цепочек исключений используется дополнение
Похожий механизм срабатывает автоматически, если исключение возбуждается внутри обработчика, либо блока
Если после инструкции присутствуют от одного до трёх выражений, то они вычисляются, чтобы получить три объекта.
При помощи первых двух из этих объектов определяется тип и значение исключения.
Если первый объект явится экземпляром. То типом исключения будет являться тип этого экземпляра, а в роли значения будет выступит сам экземпляр. Второй объект при этом должен являться
Если первый объект явится классом. То он и станет типом исключения. При этом для определения значения исключения будет использован второй объект.
Второй объект.
1. Если он явится экземпляром, то этот экземпляр и станет значением исключения.
2. Если второй объект явится кортежем, то он будет использован в качестве списка аргументов для инициализатора класса.
3. Если объект явится
Экземпляр, созданный в ходе вызова инициализатора будет являться значением исключения.
Если присутствует третий объект
То он должен являться объектом трассировки. Данный объект в делает местом, где произошло исключение, текущее место в коде.
Если объект не является ни объектом трассировки, ни
Использование трёх выражений служит для более прозрачного повторного возбуждения исключения. В сочетании с
На заметку
Дополнительная информация доступна в статьях: Встроенные исключения и try except finally.
Если после инструкции отсутствует выражение (например, не указывается тип исключения), то повторно поднимается отловленное исключение. Если в данной области нет активного исключения (например,
raise
не находится внутри блока except
), возбуждается RuntimeError (до -py3.0 возбуждалось TypeError). try:
# Допустим в функции поднимается FileNotFoundError.
do()
except OSError:
# Инструкция raise без выражения поднимет FileNotFoundError повторно.
raise
Если выражение присутствует, то результатом его вычисления должен являться либо экземпляр наследника BaseException, либо сам наследник, то есть тип. Во втором случае объект исключения будет сформирован путём инстанциирования типа без аргументов.
# Объект сформируется из класса автоматически.
raise MyException
# Формируем объект исключения вручную.
raise MyException('Моё исключение')
Объект трассировки
Объект трассировки обычно создаётся автоматически при возбуждении исключения и подвязывается к нему в атрибут
__traceback__
(поддерживает запись). Вы можете в один приём создать исключение и подвязать к нему трассировку при помощи метода исключения with_traceback()
— метод вернёт тот же объект исключения для которого вызван: raise Exception('Возбуждено исключение').with_traceback(traceback_obj)
Цепочки исключений
Для формирования цепочек исключений используется дополнение
from
, после которого требуется указать ещё одно исключение (класс, либо объект). Это исключение будет подвязано к возбуждаемому в атрибут __cause__
(поддерживает запись). В результате, если возбуждаемое исключение не обработано, но на вывод будут отправлены оба исключения: try:
print(1 / 0)
except Exception as exc:
# Наше второе исключение никто не поймает
# поэтому будет выведена цепочка
# из двух исключений.
raise RuntimeError('Явная цепочка исключений') from exc
Похожий механизм срабатывает автоматически, если исключение возбуждается внутри обработчика, либо блока
finally
— предыдущее исключение подвязывается в атрибут __context__
нового: try:
print(1 / 0)
except:
raise RuntimeError('Неявная цепочка исключений')
На заметку
+py3.3 Автоматическое формирование цепочки можно подавить, указав
None
после from
. В ходе данной операции задействуется атрибут __suppress_context__
.Python 2
Если после инструкции присутствуют от одного до трёх выражений, то они вычисляются, чтобы получить три объекта.
При помощи первых двух из этих объектов определяется тип и значение исключения.
Если первый объект явится экземпляром. То типом исключения будет являться тип этого экземпляра, а в роли значения будет выступит сам экземпляр. Второй объект при этом должен являться
None
.Если первый объект явится классом. То он и станет типом исключения. При этом для определения значения исключения будет использован второй объект.
Второй объект.
1. Если он явится экземпляром, то этот экземпляр и станет значением исключения.
2. Если второй объект явится кортежем, то он будет использован в качестве списка аргументов для инициализатора класса.
3. Если объект явится
None
, то в инициализатор будет передан пустой список аргументов.Экземпляр, созданный в ходе вызова инициализатора будет являться значением исключения.
Если присутствует третий объект
То он должен являться объектом трассировки. Данный объект в делает местом, где произошло исключение, текущее место в коде.
Если объект не является ни объектом трассировки, ни
None
, возбуждается исключение TypeError.Использование трёх выражений служит для более прозрачного повторного возбуждения исключения. В сочетании с
sys.exc_info()
это в некоторой степени похоже на то, что делает from
в Python 3: try:
do()
except:
exc_info = sys.exc_info()
raise exc_info[0], exc_info[1], exc_info[2]
Синонимы поиска: raise
В разделе «Simple Statements (простые инструкции, операторы)»:
assert
del
pass
with
Арифметические операторы
На заметку
Читайте нас в Twitter. Ссылка в самом низу страницы.