Ваш код
def bool_return():
try:
return print("foo")
except:
pass
finally:
return print("ola")
print(bool_return())
использует предложение finally
. Предложение finally выполняется перед выходом из блока try
/ except
. Это означает, что ваш аргумент может быть передан следующему (псевдокод!):
function bool_return():
do in case of errors goto Errors:
var r = print("foo") < this is the statement in the try block
print("ola") < this is the statement in the finally one
return r
Errors:
do nothing < this is the pass instruction.
var r = print ("ola")
return r
print(bool_return())
На мгновение проигнорируйте утверждение return
, которое может быть неверным, виновником вашего вопроса является то, как работает интерпретатор операторы:
return print("foo")
разбиты на две части
var r = print("foo") < this is the statement in the try block
return r
, а затем выполняется содержимое finally до возврата
var r = print("foo") < this is the statement in the try block
print ("ola")
return r
Это происходит потому, что семантика блока try
заключается в следующем
- и запускать все, что включено в блок
try
. Если он работает без ошибок, сохраните возвращаемое значение, если оно присутствует, затем запустите содержимое блока finally
. Если здесь не возникает ошибок и у нас есть возвращаемое значение, просто верните это сохраненное возвращаемое значение - , если в блоке
try
есть ошибка, затем запустите то, что находится в блоке except
(если есть). Если ошибок здесь нет, сохраните возвращаемое значение, если оно есть, запустите блок finalize
, Если ошибок здесь нет, просто верните сохраненное возвращаемое значение - , если блок
except
как ошибка, выполнение остановлен и блок finally
запущен. Затем исключение распространяется на внешний блок. - , и теперь все может запутаться, поскольку вы можете (и будете) вкладывать несколько блоков
try
. Вышеупомянутые шаги повторяются до тех пор, пока не будет обработано исключение или пока не будет достигнут блок интерпретатора try
. В последнем случае приложение останавливается, и исключение выводится на консоль с обычным синтаксисом traceback
.
Это просто для того, чтобы дать вам представление о том, как оно работает. Некоторые детали могут отсутствовать или могут быть не на 100% правильными. Если вы хотите получить больше информации, вы можете играть с исключениями на W3 C и узнать больше здесь .