Eu realmente nunca uso o finally
, então queria testar algumas coisas antes de usá-lo com mais regularidade. Percebi que ao executar:
def f():
try:
1/0
# 1/1
except:
print('except') # 1
raise # 2
finally:
print('finally') # 3
try:
f()
except:
print("haha")
obtemos esta ordem de execução:
except
finally
haha
Qual é a regra para a ordem de execução?
Pelo que vejo, recebo esta regra:
- execute tudo no
except
bloco, mas não araise
instrução, se alguma instrução estiver presente - execute o
finally
bloco - volte ao
except
bloco e execute a últimaraise
instrução, se presente
Isso está correto?
Existem outras declarações além de raise
um except
bloco que podem ser adiadas após o finally
bloco?
Mais claro com este exemplo:
def f():
try:
1/0
# 1/1
except:
print('except') #1
raise print("a") #2 # nonsense but just to see in which order this line is executed
finally:
print('finally') #3
que dá
except
a
finally
foo
De acordo com [Python.Docs]: Erros e exceções - Definindo ações de limpeza ( a ênfase é minha, leia todos os marcadores):
Então esse é o comportamento esperado.