Python Nation🐍🇺🇦
finally мовчки затирає твій return
Погляньмо на функцію:
def f():
try:
return "from try"
finally:
return "from finally"
f() # "from finally"
Здавалося б, return "from try" мав спрацювати. Але finally виконується завжди - навіть після return. І якщо в ньому є свій return, він перекриває той, що був у try.
Те саме з винятками: return у finally проковтне навіть виняток, який мав вилетіти назовні.
def g():
try:
raise ValueError("boom")
finally:
return "all good"
g() # "all good", виняток зник
Помилка сталася, але про неї ніхто не дізнається. Такий баг ловиться довго, бо код виглядає цілком робочим.
Висновок: finally тримай тільки для очищення (закрити файл, зʼєднання, відпустити лок). Ніяких return чи raise всередині - інакше він тихо перепише всю логіку вище.
1 · 137 ·