Wyjątek, zamykanie pliku i with

Możesz być ciekawy czy with na pewno zamyka plik, w przypadku gdy wystąpi wyjątek 😉

I słusznie! Możemy to łatwo przetestować za pomocą prostej konstrukcji try… except. Utwórz nowy skrypt o nazwie write_file_safe_with.py w katalogu głównym projektu.

Przygotowanie kodu

Umieść w pliku write_file_safe_with.py następującą zawartość:

try:
   # tutaj umieść operacje na pliku
except Exception as e:
   print(f'Exception: {e}')
finally:
   print(f'In block "finally". Is file closed? {file.closed}')

W bloku finally mamy print() za pomocą którego wypiszemy na konsoli informację, czy plik jest zamknięty. Ta informacja jest zawarta w atrybucie file.closed.

Skorzystajmy teraz ze zmodyfikowanego przykładu z with gdzie chcemy coś zapisać do pliku otwartego w trybie tylko do odczytu:

with open("./testFiles/fileToWriteWith.txt", mode='r') as file:                      
   file.write('Hello jaktestowac.pl!')

Jeśli umieścimy powyższy kod w bloku try to całość przyjmie postać:

try:
   with open("./testFiles/fileToWriteWith.txt", mode='r') as file:
       file.write('Hello jaktestowac.pl!')
except Exception as e:
   print(f'Exception: {e}')
finally:
   print(f'In block "finally". Is file closed? {file.closed}')

Zauważ, że plik jest otwierany jako tylko do odczytu, gdyż tryb dostępu ustawiony jest na mode='r'. Ma to za zadanie wywołanie wyjątku 😉

Testy with i wyjątku

Upewnij się, że plik fileToWriteWith.txt istnieje. Następnie uruchom skrypt write_file_safe_with.py. Czy wynik jest zgodny z oczekiwanymi? 😉 Na konsoli powinniśmy ujrzeć:

Exception: not writable
In block "finally". Is file closed? True

Jak widzisz, nawet w przypadku wystąpienia wyjątku, plik zostaje zamknięty 😉 Konstrukcja with znacznie upraszcza i ułatwia działania związane z operacjami na plikach 🙂

Podsumowanie

Instrukcja with posiada wiele niewątpliwych zalet:

  • Nie trzeba się martwić o zamykanie plików. Po zakończeniu wszystkich operacji zawartych w instrukcji with używane pliki są automatycznie zamykane.
  • Instrukcji with nie trzeba otaczać wyrażeniem try... except – gdy wystąpi wyjątek. Plik i tak zostanie poprawnie zamknięty.
TIP: Jeśli chciałbym poczytać więcej o instrukcji with, to zajrzyj do oficjalnej dokumentacji Compound statements – The with statement. My w kolejnych lekcjach pokryjemy najważniejsze i najczęściej używane zagadnienia związane z with 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *