Języki skryptowe Python

Wykład 9

Błędy (bug)


Without requirements or design, programming is the art of adding bugs to an empty text file.

Louis Srygley
  • błędy leksykalne i składniowe
  • błędy typowania
  • błędy semantyczne i logiczne
  • błędy działania
  • nieskończone obliczenia

Błędy leksykalne


  • pojedyncza jednostka leksykalna, której nie przewiduje definicja języka

Błędy składniowe (syntax error)


  • niepoprawnie zestawione poprawne jednostki leksykalne

Błędy typowania


  • wyrażenie nieadekwatne do typu

Błędy działania (runtime error)


  • pojawiają się w trakcie działania programu (np. odczyt z pliku, który nie istnieje)

Błędy semantyczne (semantic error)


  • niezgodność oczekiwań ze stanem faktycznym

Błędy logiczne


  • program liczy nie to co trzeba (w tym też błędy semantyczne)
  • najtrudniejsze do znalezienia

Nieskończone pętle


Najdroższy myślnik w historii


  • NASA (1962); Mariner 1: Floryda -> Wenus

Review Board determined that the omission of a hyphen in coded computer instructions in the data-editing program allowed transmission of incorrect guidance signals to the spacecraft.

źródło

Therac-25


  • maszyna do radioterapii nowotworów
  • na skutek błędów programistycznych kilka osób zmarło na skutek napromieniowania
  • błąd typu race condition - przy zbyt szybkim wprowadzaniu danych (przez operatora) parametry zabiegu nie były prawidłowo inicjowane

Zapobieganie błędom


  • pisanie czytelnego kodu
  • code review
  • debugowanie

Czytelność kodu


  • zrozumiałe nazwy zmiennych (nawet kosztem długości)
  • komentowanie kodu źródłowego, który nie jest zrozumiały od razu
  • tworzenie dokumentacji w trakcie pisania programu
  • opisywanie przyjętych założeń (w komentarzach i/lub dokumentacji)

Code review


  • sprawdzenie kodu przez inną osobę

Debugowanie


If debugging is the process of removing software bugs, then programming must be the process of putting them in.

Edsger Dijkstra
  • systematyczne redukowanie błędów w kodzie
  • kontrolowane wykonanie programu
  • debugger

__debug__


debug.py

Przykład


fib.py

Przykład - debug mode


Wbudowany debugger


fib.py

pdb


  • n - następna instrukcja
  • s - wejdź w funkcję
  • r - wyjdź z funkcji
  • p - wydrukuj zmienną
  • q - przerwij
  • enter - powtórz ostatnią komendę

Wyjątki (exceptions)


  • błędy działania (runtime error)
  • wykryte podczas wykonywania są nazywane wyjątkami
  • programista może decydować co robić z wyjątkami

Przykład - iloraz


Iloraz - zabezpiecznie if


Iloraz - wyjątek


Przykład - pobierz liczbę całkowitą


Typy wyjątków


  • pełna lista wbudowanych wyjątków link

Komunikat wyjątku


Przykład


try…finally


try…except…finally


Zgłaszanie wyjątków


Własne wyjątki


  • możliwe jest definiowanie własnych wyjątków
  • o tym w przyszłości, jak już poznamy klasy

assert


assert_test.py

assert_test


Operacje na plikach


  • do otwierania plików służy funkcja wbudowana open
  • przyjmuje wiele argumentów, przy czym dwa najważniejsze to: file i mode
  • file - nazwa pliku (lub pełna ścieżka, jeśli nie w katalogu roboczym)
  • mode - tryb

Tryb Opis
r tylko do oczytu (domyślnie)
w tylko do zapisu (istniejący plik zostanie nadpisany)
x tylko do zapisu (plik nie może istnieć)
a tylko do zapisu (od końca pliku)
+ aktualizowanie pliku (odczyt i zapis)
t tryb tekstowy (domyślnie)
b tryb binarny
  • np. open(file, r+b) otwiera plik do odczytu, z możliwością zapisu, w trybie binarnym

Zapis do pliku


Dopisywanie do pliku


Odczyt pliku


r+ vs a


w+ vs r+


w vs w+


UnsupportedOperation: not readable

w vs w+


seek


tell


seek and read


Uwaga


  • wygodnie jest wczytać cały plik do pamięci
    • read() - zawartość jako pojedynczy string
    • readlines() - zawartość jako lista (linia -> element)
  • jednak w przypadku dużych plików może to byś katastrofalne, wtedy lepiej
    • read(n) - wczytaj n bajtów
    • readline() - wczytaj linię

Otwieranie plików a wyjątki


with statement


  • gwarantuje, że jeśli wywołane zostało __enter__() (np. otwarcie pliku)
  • to zostanie wywołane __exit()__ (np. zamknięcie pliku)
  • nawet jeśli po drodze wystąpi wyjątek

with open


  • gwarantuje, że plik zostanie zawsze poprawnie zamknięty
  • wygodniejsze niż try…finally…