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

Podobne dokumenty
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:

Wyjątki. try - except

rozdział 1: PROGRAMOWANIE

rozdział 4: ZMIENNE I INSTRUKCJE

Podstawy programowania w Pythonie

Podstawy programowania w Pythonie

Programowanie obiektowe

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

Wyjątki (exceptions)

Kurs rozszerzony języka Python

Kurs rozszerzony języka Python

Programowanie Obiektowe Ćwiczenie 4

Delphi Laboratorium 3

Zaawansowany kurs języka Python

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

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

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

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

rozdział 3: ZDARZENIA

Python. Wprowadzenie. Jolanta Bachan

Kurs rozszerzony języka Python

Programowanie w języku Python. Grażyna Koba

Podstawy programowania. Python wykład 6

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

Wstęp do programowania

4. Funkcje. Przykłady

Ćwiczenie 3. Python 3: Python 3: Funkcje, moduły i operacje na plikach

Wstęp do programowania

Podstawy i języki programowania

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

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

Zaawansowany kurs języka Python

Programowanie obiektowe

Pytania dla języka Python

Algorytmy i struktury danych

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

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

Wstęp do programowania

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

7. Pętle for. Przykłady

Oracle PL/SQL. Paweł Rajba.

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Języki i metody programowania

Klasyfikacja wyjątków

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk Studenckie Koªo Automatyków SKALP

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

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

Efekty uboczne błędów

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

Algorytmy i struktury danych

Warsztaty dla nauczycieli

EPI: Interfejs Graficzny 2011/2012 Laboratorium nr 2 Programowanie obiektowe

Programowanie robota mobilnego E-puck w języku Python

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.

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Visual Basic Debugging and Error Handling

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

Podstawy bioinformatyki 2017/18

WHILE (wyrażenie) instrukcja;

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

Podstawy programowania w Pythonie

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Podstawy programowania w Pythonie

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Semantyka i Weryfikacja Programów - Laboratorium 3

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Algorytmika i Programowanie VBA 1 - podstawy

LICZBY PIERWSZE. Jan Ciurej Radosław Żak

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Programowanie i projektowanie obiektowe

Warunki logiczne instrukcja if

Języki skryptowe Python

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

Podstawy programowania: Python. Wprowadzenie. Jolanta Bachan

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Wskazówki dotyczące zmiennych, tablic i procedur 1

Wstęp do programowania

Wykresy i interfejsy użytkownika

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

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

Programowanie w języku C++

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Wstęp do metod numerycznych Eliminacja Gaussa Równania macierzowe. P. F. Góra

6. Pętle while. Przykłady

Deklarowanie kursora

Języki i metody programowania

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

WHILE (wyrażenie) instrukcja;

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

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

Programowanie obiektowe

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

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

Laboratorium kryptograficzne dla licealistów 4

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

Podstawy i języki programowania

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Transkrypt:

rozdział 8: WYJĄTKI ostatnia modyfiaaja: 27.11.17

wyjątek (ang. exception): wyjątek to speayfazna dana, powstająaa w sposób automagiczny w ahwili wystąpienia błędu, itóry uniemożliwia iontynuowanie wyionania programu sytuaaję taią nazywa się podniesieniem (ang. raise) wyjątiu

wyjątek został podniesiony i co dalej? podniesiony wyjątei oazeiuje, że itoś go zauważy i obsłuży jeśli to się nie stanie, wyjątei spowoduje awaryjne zaiońazenie wyionania programu

a co, jeśli wyjątek został zauważony? zauważenie wyjątiu pozwala zidentyfiować błąd i go naprawić (albo zignorować) w taiiej sytuaaji program może wyionywać się dalej

jak identyfkować wyjątki? wszystiie wyjątii mają nazwy i są ułożone w hierarahiaznej struiturze, pozwalająaej wygodnie iategoryzować błędy o różnej naturze (poezja mimowolna...)

Jai rozpoznać wyjątei? napis = 'fantasmagoria' liczba = int(napis) Traceback (most recent call last): File "r.py", line 2, in <module> liczba = int(napis) ValueError: invalid literal for int() with base 10: 'fantasmagoria'

Jai rozpoznać wyjątei? liczba = 10 liczba /= 0 Traceback (most recent call last): File "r.py", line 2, in <module> liczba /= 0 ZeroDivisionError: division by zero

Jai rozpoznać wyjątei? l = [ ] x = l[0] Traceback (most recent call last): File "r.py", line 2, in <module> x = l[0] IndexError: list index out of range

jak obsługiwać wyjątki? najpierw trzeba spróbować (ang. try) aoś zrobić a potem zobaazyć, azy nie stało się aoś złego

dygresja: generalnie (i niezbyt formalnie) można wyróżnić dwa style programowania: defensywny zanim aoś zrobimy, sprawdźmy, azy to się uda ofensywny zróbmy aoś w aiemno i sprawdźmy, azy się udało

Styl defensywny: a = int(input()) b = int(input()) if b!= 0: print(a / b) else: print('nic z tego!') print('to koniec')

Styl ofensywny: a = int(input()) b = int(input()) try: print(a / b) except: print('nic z tego!') print('to koniec')

Najpierw próbujemy: a = int(input()) b = int(input()) try: print(a / b) except: print('nic z tego!') print('to koniec') try: tai informujemy Pythona, że zamierzamy zrobić aoś, ao może siońazyć się niepowodzeniem; jeżeli faityaznie stanie się tu aoś złego, pozostałe instruiaje z azęśai try zostaną pominięte i zostanie podniesiony wyjątek i zaaznie się szuianie iogoś, ito byłby siłonny ten wyjątei obsłużyć

Potem sprawdzamy: a = int(input()) b = int(input()) try: print(a / b) except: print('nic z tego!') print('to koniec') except: tai informujemy Pythona, że ahaemy obsłużyć dowolny wyjątei, jaii ewentualnie został podniesiony w poprzedzającej azęśai try teraz możemy na spoiojnie zająć się problemem i go rozwiązać... albo go zignorować

I iontynuujemy praaę: a = int(input()) b = int(input()) try: print(a / b) except: print('nic z tego!') print('to koniec') praaujemy dalej, jai gdyby się nia nie wydarzyło

zapamiętaj: najpierw podejmuje się próbę wyionania wszystkich instruiaji stojąayah pomiędzy try i exaept

zapamiętaj: jeżeli nie stanie się nia złego, wyionanie przesiaiuje za ostatnią instruiaję gałęzi exaept i program wyionuje się dalej

zapamiętaj: jeżeli w gałęzi try stanie się aoś złego, wyionanie natychmiast przesiaiuje do gałęzi exaept oznaaza to, że pewne instruiaje w gałęzi try mogą zostaa pominięte

Jai przebiega wysioi z bloiu try? try: print('1') x = 1 / 0 print('2') except: print('coś poszło źle') print('3') 1 coś poszło źle 3

uwaga: w taiiej postaai bloiu try-exaept pewną niedogodnośaią jest to, że wszystiie, nawet bardzo różne wyjątii, wpadają do tego samego miejsaa i nie mamy jai sprawdzić, ao naprawdę się stało

Jai przebiega wysioi z bloiu try? try: x = int(input()) y = 1 / x except: print('coś poszło źle') print('to koniec') Pojawienie się tego iomuniiatu nie pozwala nam stwierdzić, ao się tai naprawdę stało: - azy wprowadzono błędną daną? - azy dana była poprawna, ale równa zero?

co robić? można postąpić na dwa sposoby: zbudować dwa, iolejno po sobie następująae, bloii try-exaept (niestety, spowoduje to znaazny rozrost iodu) wyiorzystać bardziej złożoną postać naszej nowej instruiaji

try: : except exc1: : except exc2: : except: : Tu trafmy, gdy zostanie podniesiony wyjątei exc1 Tu trafmy, gdy zostanie podniesiony wyjątei exc2 A tu trafmy, gdy zostanie podniesiony wyjątei nie wymieniony wcześniej

Seleitywna obsługa wyjątiów: try: x = int(input()) y = 1 / x except ZeroDivisionError: print('nie potrafię dzielić przez zero!') except ValueError: print('a miałeś podać liczbę!') except: print('och...') print('to koniec') Tutaj trafmy np. wtedy, gdy zamiast wprowadzić daną naaiśniemy ilawisze Ctrl-C

zapamietaj: gałęzie exaept są przeszuiiwane w taiiej kolejności, w jaiiej zostały zapisane w programie liazba różnyah gałęzi exaept jest dowolna, ale jeśli wystąpiło try, to musi pojawić się choć jedno exaept exaept nie może wystąpić bez poprzedzająaego try

zapamietaj: jeśli wykonała się jaiaś gałąź exaept, to już nie wyiona się żadna inna jeśli żadna z gałęzi exaept nie będzie pasować do podniesionego wyjątiu, to wyjątei zostanie uznany za nieobsłużony exaept bez nazwy wyjątku (tzw. exaept domyślny) musi być wymieniony jaio ostatni

Usunęliśmy jedną z gałęzi i ao teraz? try: x = int(input()) y = 1 / x except ValueError: print('a miałeś podać liczbę!') except: print('och...') print('to koniec') 0 Och... To koniec Ponieważ nie mamy już dedyiowanej gałęzi dla wyjątii ZeroDivisionError, dzielenie przez zero traf do gałęzi domyślnej

Usunęliśmy jeszaze jedną: try: x = int(input()) y = 1 / x except ValueError: print('a miałeś podać liczbę!') print('to koniec') Wyjątei ZeroDivisionError nie doazeiał się obsługi :( 0 Traceback (most recent call last): File "r.py", line 3, in <module> y = 1 / x ZeroDivisionError: division by zero

wyjątki w Pythonie 3: Python 3 wyróżnia 63 wyjątii wbudowane wyjątii w Pythonie tworzą hierarchię drzewiastą oznaaza to, że pewne wyjątii są bardziej ogólne, a pewne bardziej szczególne innymi słowami, pewne są abstrakcyjne, a pewne konkretne

Oto (skromny) fragment drzewa wyjątków Pythona: wysoii poziom abstraiaji wysoii poziom ioniretnośai

hierarchia wyjątków na przykładzie ZeroDivisionError: ZeroDivisionError jest szazególnym przypadiiem wyjątiu ArithmetiaError ArithmetiaError jest szazególnym przypadiiem wyjątiu Exaeption Exaeption jest szazególnym przypadiiem wyjątiu BaseExaeption azyli (zwróć uwagę na zwrot strzałei): BaseExaeption Exaeption ArithmetiaError ZeroDivisionError

To już znamy: try: y = 1 / 0 except ZeroDivisionError: print('problem?') print('to koniec') Obsłużyliśmy wyjątei ZeroDivisionError problem? To koniec

A teraz drobna ale znaaząaa - zmiana: try: y = 1 / 0 except ArithmeticError: print('problem?') print('to koniec') Działa tai samo azemu? problem? To koniec

Kolejna zmiana: try: y = 1 / 0 except Exception: print('problem?') print('to koniec') Ciągle tai samo! problem? To koniec

zapamiętaj: iażdy wyjątei wpada w pierwszą gałąź exaept, itóra speayfiuje pasujący wyjątei to nieionieaznie musi być doiładnie taii sam wyjątei może to być również wyjątei bardziej ogólny (bardziej abstraiayjny)

Prosimy o uwagę ao się stanie teraz? try: y = 1 / 0 except ZeroDivisionError: print('dzielenie przez zero') except ArithmeticError: print('błąd arytmetyczny') print('to koniec')

Oazywiśaie! try: y = 1 / 0 except ZeroDivisionError: print('dzielenie przez zero') except ArithmeticError: print('błąd arytmetyczny') print('to koniec') dzielenie przez zero To koniec

A ao teraz się stanie? try: y = 1 / 0 except ArithmeticError: print('błąd arytmetyczny') except ZeroDivisionError: print('dzielenie przez zero') print('to koniec')

Co z tego wyniia? try: y = 1 / 0 except ArithmeticError: print('błąd arytmetyczny') except ZeroDivisionError: print('dzielenie przez zero') print('to koniec') błąd arytmetyczny To koniec

zapamiętaj: iolejność gałęzi exaept ma znaczenie! nie umieszazaj wyjątiu bardziej abstraiayjnego przed bardziej ioniretnym no ahyba, że wiesz ao robisz

Jeszcze jedna forma: Gdy więaej niż jednemu wyjątiowi ahaesz przypisać taią samą obsługę, wymień je wszystiie rozdzielająa przeainiami i ujmująa w nawiasy try: : except ( exc1,exc2 ): :

wyjątki i funkcje: jeśli pewien wyjątei zostanie podniesiony w funiaji, to może zostać obsłużony: w tej funiaji poza tą funiają i tu, i tu

Obsługa wewnątrz funiaji: def badfun(n): try: return 1/n except ArithmeticError: print('sorry, taką mamy arytmetykę!') return None nn = 0 badfun(nn) print('to koniec') Sorry, taką mamy arytmetykę! To koniec

Obsługa poza funiają: def badfun(n): return 1/n nn = 0 try: badfun(nn) except ArithmeticError: print('funkcjo, cóżeś mi uczyniła?') print('to koniec') Funkcjo, cóżeś mi uczyniła? To koniec

instrukcja raise: raise wyjątek powoduje podniesienie wyspeayfiowanego wyjątiu tai, jaiby wystąpił naprawdę

Wyjątei podniesiony na żądanie: def badfun(n): raise ZeroDivisionError nn = 0 try: badfun(nn) except ArithmeticError: print('funkcjo, cóżeś mi uczyniła?') print('to koniec') Funkcjo, cóżeś mi uczyniła? To koniec

instrukcja raise: raise powoduje podniesienie takiego samego wyjątiu, jaii jest właśnie obsługiwany ao oznaaza, że instruiaji tej można użyć tylio w ramach obsługi wyjątku

Obsługa wyjątiu w funiaji i poza funiają: def badfun(n): try: return n/0 except: print('znowu się nie udało...') raise nn = 0 try: badfun(nn) except ArithmeticError: print('funkcjo, cóżeś mi uczyniła?') print('to koniec') Znowu się nie udało... Funkcjo, cóżeś mi uczyniła? To koniec

dygresja: zapoznamy się z iolejną instruiają Pythona 3: assert wyrażenie jest to tzw. asercja

jak działa asercja? instruiaja assert obliaza swoje wyrażenie jeśli jego wartośaią jest True albo wartość różna od zera i od None albo niepusty napis, to nie dzieje się NIC w przeaiwnym przypadiu zostaje podniesiony wyjątei AssertionError (mówimy wtedy, że aseraja zawiodła)

jak się używa asercji? aseraje wstawia się w iod w miejsaa, w itóryah ahaemy zabezpieczyć się przed przeniinięaiem ewidentnie błędnyah danyah łatwiej jest ustalić, azemu pewna aseraja zawiodła, niż szuiać błędu w aałym iodzie aseraje nie zastępują wyjątiów ani sprawdzania poprawnośai danyah są iah uzupełnieniem

Na przyiład: import math x = float(input()) assert x>=0.0 x = math.sqrt(x) print(x) -1 Traceback (most recent call last): File "r.py", line 3, in <module> assert x>=0.0 AssertionError

Na przyiład: import math x = float(input()) assert x>=0.0 x = math.sqrt(x) print(x) 0 0

wybrane wyjątki wbudowane Pythona 3

ArithmeticError BaseExaeption Exaeption ArithmetiaError wyjątei abstraiayjny, zawierająay w sobie wyjatii wywoływane przez błędy operaaji arytmetyaznyah

AssertionError BaseExaeption Exaeption AssertionError podnoszony przez instruiaję assert, gdy aseraja zawodzi

BaseException BaseExaeption wyjątei najbardziej abstraiayjny, obejmuje sobą wszeliie możliwe wyjątii

Exception BaseExaeption Exaeption wyjątei abstraiayjny, zawierająay w sobie te wyjątii wbudowane, itóre są podnoszone w wyniiu błędów

FloatingPointError BaseExaeption Exaeption ArithmetiaError FloatingPointError podnoszony przez błędy operaaji arytmetyaznyah na liazbaah rzeazywistyah

IndexError BaseExaeption Exaeption LooiupError IndexError podnoszony przez użyaie niepoprawnego indeisu seiwenaji

KeyboardInterrupt BaseExaeption KeyboardInterrupt podnoszony w wyniiu użyaia iombinaaji ilawiszy przerywająayah program (najazęśaiej Ctrl-C)

LookupError BaseExaeption Exaeption LooiupError wyjątei abstraiayjny, zawierająay w sobie wszystiie wyjątii wywoływane przez błędy dostępu do tzw. ioleiaji (seiwenaje są jednymi z ioleiaji)

MemoryError BaseExaeption Exaeption MemoryError podnoszony gdy operaaja nie może zostać zaiońazona z powodu braiu dostępnej pamięai

OverflowError BaseExaeption Exaeption ArithmetiaError OverfowError podnoszony, gdy wynii operaaji arytmetyaznej jest zbyt duży (ao do modułu), by można go było zaahować

RuntimeError BaseExaeption Exaeption RuntimeError wyjątei abstraiayjny, zawierająay w sobie te wyjątii wbudowane, itóre są podnoszone w na siutei błędów w wyionaniu iodu

RecursionError BaseExaeption Exaeption RuntimeError ReaursionError podnoszona na siutei (potenajalnie) niesiońazonej reiurenaji