PPy3/TematyDodatkowe: Różnice pomiędzy wersjami

Z Brain-wiki
(Utworzono nową stronę "= Tematy dodatkowe = == Błędy i wyjątki == Każdy programista popełnia błędy — jest to nieunikniona część tej działalności. *Są błędy, które mo...")
 
Linia 19: Linia 19:
 
Jak wspomniano powyżej, w przypadku napotkania błędu składniowego w kodzie programu interpreter natychmiast przerwie wykonywanie programu i wypisze komunikat. Komunikaty te '''warto czytać uważnie''' &mdash; w większości przypadków znajduje się w nich cała informacja konieczna dla naprawienia błędu. Przykład: usiłujemy uruchomić program <tt>błąd.py</tt>, którego treść to
 
Jak wspomniano powyżej, w przypadku napotkania błędu składniowego w kodzie programu interpreter natychmiast przerwie wykonywanie programu i wypisze komunikat. Komunikaty te '''warto czytać uważnie''' &mdash; w większości przypadków znajduje się w nich cała informacja konieczna dla naprawienia błędu. Przykład: usiłujemy uruchomić program <tt>błąd.py</tt>, którego treść to
  
<code lang=python>
+
<source lang=python>
 
x = (2 + 3) 4
 
x = (2 + 3) 4
 
print x
 
print x
</code>
+
</source>
  
 
Wynik pierwszej próby to:
 
Wynik pierwszej próby to:
<code>
+
 
 +
<source lang=bash>
 
$ python3 błąd.py  
 
$ python3 błąd.py  
 
   File "błąd.py", line 1
 
   File "błąd.py", line 1
Linia 31: Linia 32:
 
                 ^
 
                 ^
 
SyntaxError: invalid syntax
 
SyntaxError: invalid syntax
</code>
+
</source>
  
 
Z komunikatu całkiem jasno wynika, że napotkany został błąd składni (''SyntaxError''), że wykryto ten błąd w linijce 1, a nawet dokładnie &mdash; że miejscem, w którym interpreter stwierdził, że ma do czynienia z nieprawidłowy kodem, było wystąpienie cyfry 4 po zamykającym nawiasie. Po prostu zapomnieliśmy, że &mdash; inaczej niż w powszechnie stosowanej notacji matematycznej &mdash; w Pythonie aby uzyskać mnożenie, konieczne jest napisanie jawnie znaku operatora (gwiazdki).
 
Z komunikatu całkiem jasno wynika, że napotkany został błąd składni (''SyntaxError''), że wykryto ten błąd w linijce 1, a nawet dokładnie &mdash; że miejscem, w którym interpreter stwierdził, że ma do czynienia z nieprawidłowy kodem, było wystąpienie cyfry 4 po zamykającym nawiasie. Po prostu zapomnieliśmy, że &mdash; inaczej niż w powszechnie stosowanej notacji matematycznej &mdash; w Pythonie aby uzyskać mnożenie, konieczne jest napisanie jawnie znaku operatora (gwiazdki).
  
 
Po naprawieniu tej pomyłki próbujemy jeszcze raz, i wynik to:
 
Po naprawieniu tej pomyłki próbujemy jeszcze raz, i wynik to:
<code>
+
<source lang=bash>
 
$ python3 błąd.py  
 
$ python3 błąd.py  
 
   File "błąd.py", line 2
 
   File "błąd.py", line 2
Linia 42: Linia 43:
 
           ^
 
           ^
 
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(x)?
 
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(x)?
</code>
+
</source>
  
 
Tutaj już jaśniej być nie może; interpreter nie tylko wskazał nam dokładne miejsce wystąpienia błędu, ale nawet dokładnie opisał, jak go naprawić.
 
Tutaj już jaśniej być nie może; interpreter nie tylko wskazał nam dokładne miejsce wystąpienia błędu, ale nawet dokładnie opisał, jak go naprawić.

Wersja z 12:20, 27 mar 2018

Tematy dodatkowe

Błędy i wyjątki

Każdy programista popełnia błędy — jest to nieunikniona część tej działalności.

  • Są błędy, które można nazwać banalnymi: literówka w nazwie lub słowie kluczowym, zapomniany dwukropek, niedomknięte nawiasy, itp.
  • Są bardziej podstępne błędy logiczne: gdy algorytm, którego zapisem ma być tworzony kod, po prostu nie robi dokładnie tego, co nam się wydaje.
  • I w końcu są sytuacje wyjątkowe: gdy w toku pracy programu zachodzą nieoczekiwane okoliczności — użytkownik podał błędną nazwę pliku z danymi, zawartość tego pliku nie jest zgodna z oczekiwaniami programu, połączenie sieciowe ulega przerwaniu w trakcie pobierania lub przesyłania danych, itp.

Wszystkie te sytuacje nazywa się wyjątkami, i tym samym słowem określa się mechanizm, jakiego wiele współczesnych języków programowania (w tym Python) dostarcza programiście, aby mu pomóc określić działania jakie program miałby podjąć w sytuacjach wyjątkowych. Wyjątkowość takich sytuacji generalnie polega na tym, że w przypadku ich wystąpienia program po prostu nie może kontynuować przewidzianego toku działania:

  • błąd w składni programu oznacza, że kod nie daje się zinterpretować w sposób jednoznaczny; najlepsze co można zrobić, to w momencie wykrycia błędu przerwać działanie i spróbować dostarczyć programiście (w formie komunikatu) informację ułatwiającą określenie i naprawienie błędu;
  • błędne działanie algorytmu można np. spróbować wykrywać za pomocą tzw. asercji (polecenie assert) badających, czy pewne warunki, jakie powinny być spełnione przez dane przetwarzane w programie są istotnie spełnione;
  • wyjątki powstałe na skutek okoliczności zachodzących w trakcie działania programu, uniemożliwiających jego normalną kontynuację, można spróbować przewidzieć i przygotować program do odpowiedniego zareagowania, czyli obsługi wyjątku. Na przykład, można spróbować ponowić jeszcze raz (lub kilka razy) próbę łączności sieciowej, i poddać się dopiero po określonej liczbie niepowodzeń; natomiast w sytuacji błędu wynikającego z podania przez użytkownika programu niewłaściwych argumentów uruchomienia, warto postarać się o przekazanie użytkownikowi komunikatu informującego go w sposób dla niego zrozumiały, o właściwym sposobie uruchamiania programu.

Błędy składniowe

Jak wspomniano powyżej, w przypadku napotkania błędu składniowego w kodzie programu interpreter natychmiast przerwie wykonywanie programu i wypisze komunikat. Komunikaty te warto czytać uważnie — w większości przypadków znajduje się w nich cała informacja konieczna dla naprawienia błędu. Przykład: usiłujemy uruchomić program błąd.py, którego treść to

x = (2 + 3) 4
print x

Wynik pierwszej próby to:

$ python3 błąd.py 
  File "błąd.py", line 1
    x = (2 + 3) 4
                ^
SyntaxError: invalid syntax

Z komunikatu całkiem jasno wynika, że napotkany został błąd składni (SyntaxError), że wykryto ten błąd w linijce 1, a nawet dokładnie — że miejscem, w którym interpreter stwierdził, że ma do czynienia z nieprawidłowy kodem, było wystąpienie cyfry 4 po zamykającym nawiasie. Po prostu zapomnieliśmy, że — inaczej niż w powszechnie stosowanej notacji matematycznej — w Pythonie aby uzyskać mnożenie, konieczne jest napisanie jawnie znaku operatora (gwiazdki).

Po naprawieniu tej pomyłki próbujemy jeszcze raz, i wynik to:

$ python3 błąd.py 
  File "błąd.py", line 2
    print x
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(x)?

Tutaj już jaśniej być nie może; interpreter nie tylko wskazał nam dokładne miejsce wystąpienia błędu, ale nawet dokładnie opisał, jak go naprawić.