Pisząc kod w Pythonie na pewno już nie raz coś poszło nie tak i Shell wypisał komunikat o błędzie podobny do poniższego:

Podobne dokumenty
Wyjątki. try - except

Programowanie obiektowe

Podstawy programowania. rozdział 8: WYJĄTKI. ostatnia modyfiaaja:

Kurs rozszerzony języka Python

Język Python (3) Język Python (3) 1/35

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Programowanie Obiektowe Ćwiczenie 4

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Programowanie obiektowe

Podstawy programowania w Pythonie

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Wstęp do programowania

Informatyka 2015/16 wykład 9. Pliki Sterowanie przebiegiem programu cz. 2. Dr inż. Witold Nocoń (p. 230)

Język Python. Język Python 1/35

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

rozdział 4: ZMIENNE I INSTRUKCJE

Programowanie obiektowe

Programowanie w Sieci Internet. Python: Operacje z plikami oraz obsługa wyjątków

Programowanie w języku Python. Grażyna Koba

Wyjątki (exceptions)

Visual Basic Debugging and Error Handling

Zaawansowany kurs języka Python

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Oracle PL/SQL. Paweł Rajba.

Podstawy programowania w Pythonie

Warsztaty dla nauczycieli

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Delphi Laboratorium 3

2. Składnia Pythona. Robert Janczewski. Gdańsk, 2014

Algorytmy i struktury danych

Środowisko programisty

Podstawy i języki programowania

Przegląd języka Python. Łukasz Anwajler

Aplikacje w środowisku Java

Python. Wprowadzenie. Jolanta Bachan

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

3. Instrukcje warunkowe

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Kurs rozszerzony języka Python

1 Podstawy c++ w pigułce.

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Dawid Gierszewski Adam Hanasko

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Środowisko programisty

Podstawy. Jan Koprowski Politechnika Gdańska, FTiMS Informatyka Stosowana

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Wątki i komunikacja między nimi w języku Python

Materiały do zajęć III

Podstawowe I/O Liczby

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Wykład 8: Obsługa Wyjątków

Podstawy programowania w Pythonie

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

Zaawansowane programowanie w języku C++ Wyjątki

Programowanie robota mobilnego E-puck w języku Python

DECLARE VARIABLE zmienna1 typ danych; BEGIN

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

lekcja 8a Gry komputerowe MasterMind

do MATLABa programowanie WYKŁAD Piotr Ciskowski

Wykład 2 Programowanie zorientowane obiektowo w Pythonie

Algorytmy i struktury danych

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Efekty uboczne błędów

Wstęp do Programowania, laboratorium 02

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Wstęp do Informatyki i Programowania Laboratorium: Lista 1 Środowisko programowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Zaawansowany kurs języka Python

Pobieranie argumentów wiersza polecenia

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Liczby losowe i pętla while w języku Python

Język Python (2) Język Python (2) 1/36

Języki i metody programowania

Pytania dla języka Python

Część XV C++ Ćwiczenie 1

PROLOG INNE PRZYKŁADY MACIEJ KELM

Wykresy i interfejsy użytkownika

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Python wstęp. Michał Bereta

System operacyjny Linux

Działanie systemu operacyjnego

Programowanie - instrukcje sterujące

Transkrypt:

Wyjątki Pisząc kod w Pythonie na pewno już nie raz coś poszło nie tak i Shell wypisał komunikat o błędzie podobny do poniższego: >>> 1/ File "<pyshell#5>", line 1, in <module> 1/ ZeroDivisionError: integer division or modulo by zero Tak na prawdę został zgłoszony pewien wyjątek, gdyż interpreter Pythona spotkał kod, którego nie umiał wykonać (w tym przypadku dzielenie przez 0), następnie interpreter nie znalazł kodu przeznaczonego do obsługi zgłoszonego wyjątku i w efekcie program został przerwany. W tym rozdziale opiszę jak można obsługiwać wyjątki, w jaki sposób po zgłoszeniu wyjątków jest poszukiwany kod do ich obsługi i w końcu jak tworzyć i zgłaszać własne wyjątki. Python dostarcza wielu wyjątków: >>> import exceptions >>> dir(exceptions) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', ' doc ', ' name ', ' package '] Warto spróbować wygenerować ręcznie każdy z nich. Na przykład AssertionError jest zgłaszany gdy wyrażenie w poleceniu assert zwróci fałsz: >>> assert 1 ==

File "<pyshell#6>", line 1, in <module> assert 1 == AssertionError Polecenie assert przydaje się do sprawdzania warunków poprawności w naszym kodzie, jeśli w danym miejscu kodu chcemy się upewnić, że pewien warunek jest spełniony to warto użyć polecenia assert. Do polecenia assert można dodać opis warunku - ten opis zostanie przekazany w wyjątku jeśli asercja będzie fałszywa: >>> assert 1 ==, 'opis bledu' File "<pyshell#13>", line 1, in <module> assert 1 ==, 'opis bledu' AssertionError: opis bledu Wygoda polecenia assert polega na tym, że wszystkie testy można wyłączyć uruchamiając Pythona z opcją -O w linii poleceń. Poniżej klika przykładów, które zgłaszają wyjątki: >>> open('plik_ktorego_brakuje', 'r') File "<pyshell#25>", line 1, in <module> open('plik_ktorego_brakuje', 'r') IOError: [Errno 2] No such file or directory: 'plik_ktorego_brakuje' >>> A = [, 1, 2] >>> A[3] File "<pyshell#27>", line 1, in <module> A[3] IndexError: list index out of range >>> A['Ala'] File "<pyshell#29>", line 1, in <module> A['Ala'] TypeError: list indices must be integers, not str >>> import brakujacy_modul File "<pyshell#36>", line 1, in <module> import brakujacy_modul ImportError: No module named brakujacy_modul

>>> B = {} >>> B['Ala'] File "<pyshell#38>", line 1, in <module> B['Ala'] KeyError: 'Ala' >>> a File "<pyshell#39>", line 1, in <module> a NameError: name 'a' is not defined >>> C = [] >>> c = C. iter () >>> c.next() File "<pyshell#49>", line 1, in <module> c.next() StopIteration >>> C.iter() File "<pyshell#50>", line 1, in <module> C.iter() AttributeError: 'list' object has no attribute 'iter' >>> if c SyntaxError: invalid syntax Jak widać wyjątki nie zawsze są czymś złym - na przykład wyjątek StopIteration jest zgłaszany gdy iterator dotarł do końca sekwencji i ten mechanizm jest wykorzystywany do zatrzymania pętli for. Wyjątki można obsługiwać dzięki konstrukcji try-except-else-finally. W bloku try piszemy kod, który chcemy wykonać, następnie możemy podać dowolnie dużo bloków except, mogą one obsługiwać wybraną klasę wyjątku (wraz ze wszystkimi podklasami), wiele klas wyjątków i w końcu wszystkie wyjątki, następnie co najwyżej jeden blok else zawierający kod, który zostanie wykonany jeśli w bloku try nie został zgłoszony żaden wyjątek i blok finally, którego kod zostanie wykonany na samym końcu niezależnie od tego czy w bloku try lub else pojawił się wyjątek czy nie. Blok finally jest zazwyczaj wykorzystywany do wykonywania operacji sprzątania - zamykania otwartych plików, zwalniania połączeń z bazą danych itp. Po wystąpieniu wyjątku przerywane jest normalne wykonanie programu i rozpoczyna się poszukiwanie kodu, który może obsłużyć dany wyjątek - jeśli wyjątek pojawił się w bloku try, to w pierwszej kolejności przeglądane są wszystkie występujące niżej bloki except, jeśli nie zostanie znaleziony odpowiedni, przeszukiwanie przenosi się do miejsc z którego został wywołany kod, który zgłosił wyjątek (jeśli wyjątek pojawił się w funkcji to przechodzimy do kodu wywołującego funkcję), jeśli to wywołanie było otoczone blokiem try to przeszukiwane są

odpowiadające mu bloki except itd aż dojdziemy do poziomu skryptu, jeśli nie został znaleziony odpowiedni blok except to wyjątek przerywa wykonanie programu i zostaje wypisany na standardowe wyjście błędów. Szukanie kodu obsługującego dany wyjątek jest przerywane jeśli udało się znaleźć odpowiedni blok except (wyłapujący wyjątki tej klasy co zgłoszony, klas po których zgłoszony dziedziczył lub wszystkie wyjątki), z takiego bloku za pomocą polecenia raise można ponownie zgłosić ten sam wyjątek i znów rozpocznie się poszukiwanie kodu, który może go obsłużyć. Po znalezieniu odpowiedniego bloku except program jest wykonywany dalej od miejsca w którym kończy się odpowiadający mu blok try. Te mechanizmy ilustruje poniższy przykład: def f(a, b, c, d): A = dict(x =., y = 1., z = 2.) B = [, 1, 2] print 'w funkcji f przed obliczeniami' wynik = A[a] / B[b] + float(c) except KeyError: print 'obsługa wyjątku KeyError w f i ponowne zgłoszenie' raise except ArithmeticError: print 'obsługa wyjątku ArthmeticError w funkcji f' print 'ale też wszystkich klas dziedziczących po nim, więc w szczególności ZeroDivisionError' #raise except ZeroDivisionError: print 'obsługa ZeroDivisionError w f' #tu nigdy nie trafimy bo wyjątki tego typu są obsłużone poprzednim except else: print 'obliczenie się powiodło wynik = ' + str(wynik) print 'w funkcji f po obliczeniach próbuję otworzyć plik' p = open(d, 'r') assert p.read() == '', 'plik nie jest pusty' except IOError: print 'obsługa wyjątku IOError w funkcji f' else: print 'blok else w funkcji f' finally: print 'blok finally w funkcji f' if 'p' in dir(): p.close() print 'kod po bloku try w f' def g(*a, **b): print 'przed wywołaniem f'

f(*a, **b) print 'po wywołaniu f' except TypeError as error: print 'obsługa wyjątku TypeError w funkcji g, wypiszę informacje o wyjątku:' print 'typ wyjątku :' + str(type(error)) + ' dołączona infomracja : ' + str(error) except (KeyError, AssertionError): print 'obsługa wyjątku KeyError i AssertionError w funkcji g' else: print 'blok else w funkcji g' finally: print 'blok finally w funkcji g' print 'kod po bloku try w g' Różne zachowania powyższego kodu można zobaczyć uruchamiając kolejno następujące wywołania (w komentarzach podano wyjątki, które są zgłaszane): g() #TypeError g('a',, 1, 2) #KeyError g('x', 4, 1, 2) #IndexError g('x',, '2.2', 'pusty_plik') #ZeroDivisionError g('x', 1, 'a', 'pusty_plik') #ValueError except: print 'nie podając klas wyjątków jakie chce złapać - łapię wszstkie' g('x', 1, '2.2', 'b') #IOError g('x', 1, '2.2', 'niepusty_plik') #AssertionError g('x', 1, '2.2', 'pusty_plik') #brak wyjątków Warto podkreślić, że ponowne zgłoszenie wyjątku w bloku except poszukiwania bloków obsługujących dany wyjątek omija bloki poniżej aktualnie wykonywanego except (po odkomentowaniu raise w except ArthmeticError w funkcji f nadal nie wchodzimy do except ZeroDivisionError). Wyjątki można stosować zamiast przeprowadzania testów danych które dostaliśmy - na przykład zamiast sprawdzać czy użytkownik wpisał na wejściu liczbę całkowitą po prostu wykonajmy rzutowanie otrzymanego napisu na int i jeśli coś się nie powiodło to zostanie zgłoszony wyjątek.

Takie podejście zwiększa czytelność kodu. Pisząc testy musimy w wielu miejscach wstawić konstrukcję warunkową, natomiast wykorzystując wyjątki cały kod, który może się nie udać wstawiamy do bloku try, a później piszemy odpowiednie bloki except. Tworzone samodzielnie wyjątki powinny być klasami dziedziczącymi po Exception, można je zgłaszać poleceniem raise, oto prosty przykład: class MyException(Exception): def init (self, info): self.info = info def str (self): return str(self.info) raise MyException("informacja niesiona z wyjątkiem") except MyException as error: print error Zadanie 1 Napisz funkcję rysującą wykres sygnału sinusoidalnego w funkcji czasu dla różnych częstości, o których podanie kolejno użytkownik będzie proszony w funkcji input, której wynik zostanie następnie ewaluowany funkcją eval. Pętla powinna się zatrzymać po wpisaniu przez użytkownika słowa 'stop'. W wypadku nie wpisania niczego, powinien pojawić się krótki help. W wypadku podania wartości, której nie da się ewaluować, program powinien wyjaśniać, co było nie tak, ale działać dalej. "Programowanie dla Fizyków Medycznych"