Odpowiadając krótko – wtedy kiedy chcesz mieć pewność że jakieś instrukcje wykonają się NA PEWNO i ZAWSZE. Nawet w bardzo dziwnych i nietypowych sytuacjach.
Zazwyczaj np. uważamy, że kod w funkcji po słowie return się nie wykona:
def DoSomething(a,b): c=a+b return c c=3+3 return c DoSomething(1,1)
i rzeczywiście tak jest:
Out[66]: 2
Ale kiedy popatrzysz na taki zwariowany kod:
def TestTryCatchFinally(a,b): try: print('starting TRY') c = a / b print('ending TRY') return c except: print('starting EXCEPT') c = b / a print('ending EXCEPT') return -1 finally: print('starting FINALLY') c = 9 return c print('ending FINALLY')
i wywołasz go tak:
TestTryCatchFinally(1,2) starting TRY ending TRY starting FINALLY Out[68]: 9
To zobacz, że kod z bloku finally się wykonał, pomimo tego, że wykonywał się kod w try!
TestTryCatchFinally(1,0) starting TRY starting EXCEPT ending EXCEPT starting FINALLY Out[69]: 9
Tutaj finally wykonał sie mimo błedu w try
TestTryCatchFinally(0,0) starting TRY starting EXCEPT starting FINALLY Out[70]: 9
A tutaj mimo błedu w try i except.
Finally jest „nie do zabicia”… dlatego stosujemy go np. do zamknięcia plików, usunięcia roboczych danych itp.