W przypadku dłuższego kodu, lepiej jest użyć kilku bloków try/except, ponieważ po wystąpieniu wyjątku, dalsza część kodu po try nie jest wykonywana. Do zamykania pliku najlepiej jest użyć finnaly:
try:
file=open('Somefile.txt') # Plik nie istnieje, lub brak uprawnień => pojawia się wyjątek i od razu przechodzimy do except
data=file.read().splitlines() # Wtedy to nie zostanie wykonane
print(data[999]) # Ta linia też na nic się nie zda
except FileNotFoundError:
print('Plik nie istnieje')
except PermissionError:
print('Nie masz uprawnień do otwarcia pliku')
except IndexError:
print('Nie ma linii o takim numerze')
finally: # Działania końcowe
file.close()
Powyższy kod nie jest dobrze zaimplementowany, ponieważ jeżeli wystąpi jakikolwiek wyjątek w instrukcji try, reszta tej instrukcji nie jest wykonywana. Na przykład, gdyby nie było finally, plik nie zostałby zamknięty, a dane zostałyby utracone, jeżeli kod byłby podzielony na kilka bloków try/except, byłoby większe prawdopodobieństwo, że program zakończy swoje działanie bez niepowodzeń.
Co ważne, nie pisz zbędnego kodu w blokach try/except, jeżeli będziesz tak robił, niepożądane błędy mogę pozostać niezauważone, a tego nie chcemy. Pamiętaj też, że jeżeli wykonujesz operacje na pliku w bloku try/except, na koniec dodaj też finally: file.close() dla bezpiecznego zamknięcia pliku. Instrukcje z finally są wykonywane po bloku try/except niezależnie od tego, czy kod z try zakończył się powodzeniem, czy pojawiły się jakieś błędy, w wyniku których został wykonany kod z któregoś except.