Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

Podobné dokumenty
3. Řízení běhu programu

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Psaní jednoduchých programů (2. přednáška) F F U K. Jonathan L. Verner. Department of Logic

Funkce - opakování. Funkce může přijímat parametry na vstupu a může vracet parametry na výstupu.

Python profesionálně: dynamické parametry, generátory, lambda funkce... with. Dynamické parametry

IB111 Úvod do programování skrze Python Přednáška 7

Automatické testování softwaru. Testujte svůj kód! Předpoklady: Příklad: sum_digits() Možnost 1: Zkusíme funkci použít v konzoli Pythonu.

Výjimky. Tomáš Pitner, upravil Marek Šabo

Vestavěné nástroje Pythonu

Konečný automat. Jan Kybic.

Zápis programu v jazyce C#

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 23, 2016

IB111 Základy programování Radek Pelánek

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

Ošetření chyb a výjimky

Kurz Databáze. Přechod na SQL server. Obsah. Vytvoření databáze. Lektor: Doc. Ing. Radim Farana, CSc.

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Programování v Pythonu

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Programování v Pythonu

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Třídění a vyhledávání Searching and sorting

Java Cvičení 05. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

Základy algoritmizace 4. Problémy, algoritmy, data

IB111 Základy programování Radek Pelánek

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Spojový seznam. Jan Kybic.

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Programování v Pythonu

IUJCE 07/08 Přednáška č. 1

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

KTE / ZPE Informační technologie

Z. Kotala, P. Toman: Java ( Obsah )

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Gradle.

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

5. Vyhledávání a řazení 1

Introduction to MS Dynamics NAV

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Scrapping stránek prakticky: Dívka dne na TN.cz

Úvod do programovacích jazyků (Java)

Maven. Aplikační programování v Javě (BI-APJ) - 2 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Jazyk C# a platforma.net

Programování v Pythonu


Připravil: David Procházka. Programovací jazyk C++

Algoritmizace a programování

A4B99RPH: Řešení problémů a hry Čistý kód.

Čipové karty Lekařská informatika

Úvod do programovacích jazyků (Java)

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Výjimky. Práce se soubory.

Distribuované systémy a výpočty

2N Voice Alarm Station

2N LiftIP. Voice Alarm Station. Communicator for Lifts. Version

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

B4B33RPH: Řešení problémů a hry PEP 8. Čistý kód.

Funkce, řetězce, moduly

Granit 1280i. Stručný návod k použití. Industrial Full Range Laser Scanner CZ-QS Rev A 1/14

Sekvenční a podmíněné provádění

Výjimky a ošetřování chyb v PHP. Who is General Failure and why is he reading my disk?!

Jak resetovat heslo administrátora Rychlý průvodce HIKVISION TECHNICAL SUPPORT TEAM

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

6. Příkazy a řídící struktury v Javě

PB161 Programování v jazyce C++ Přednáška 8

Administrace Oracle. Práva a role, audit

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Skriptovací jazyky. Obsah

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 9

Příručka aplikace KNetWalk. Fela Winkelmolen Eugene Trounev

Programování v jazyce JavaScript

Soubor jako posloupnost bytů

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

# vstup sa konvertuje na celé číslo a uloží do premennej

EURO přeshraniční platba

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

11. Přehled prog. jazyků

Programování: základní konstrukce. IB111 Úvod do programování

Programy a algoritmy pracující s čísly

Programování v Pythonu

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Algoritmizace a programování

Instrukce pro vzdálené připojení do učebny 39d

Algoritmy a programování - Úvod

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Řídicí struktury. alg3 1

Java Výjimky Java, zimní semestr

Transkript:

Chyby a výjimky Petr Pošík Katedra kybernetiky, FEL ČVUT v Praze OI, B4B33RPH Řešení problémů a hry, 2016 Chyba Stav programu (podmínky), který mu brání v dosažení požadovaného výsledku. Odkud se chyby berou? Abychom dosáhli požadovaného výsledku, programátor musí program napsat, obvykle s využitím dalších knihoven, program se musí spustit v nějakém prostředí a uživatel musí do programu vložit vstupní data. Kdo chyby opravuje? Lidi. Vývojář, administrátor, uživatel. K tomu potřebují informace. Program by jim je měl poskytnout. Co můžete dělat jako programátor? Testovat! Syntaktické chyby: kód nepůjde ani spustit. Chyby ve vašem kódu nebo v používaných knihovnách: unit testy. Nesoulad mezi předpoklady knihovních funkcí a vaším chápáním těchto předpokladů: integrační testy. Co ale dělat, když váš kód dostane chybné vstupy, nebo je špatně nastavené prostředí? Napsat kód tak, aby byl na tyto výjimečné situace připraven a aby poskytl uživateli/administrátorovi systému informace, jak chyby napravit! Dvě hlavní metody práce s chybami 1. Chybové stavy jako návratové kódy funkcí.

2. Výjimky. Obě metody mají svá pro i proti (a horlivé zastánce i odpůrce). Chyby jako návratové hodnoty funkcí Funkce vrací True/False (úspěch/neúspěch) nebo celé číslo (0 úspěch, jiné číslo je kód chyby). Klady Zápory: Snazší debugging, jednodušší metoda, rychlejší. Každý volající kód se musí s návratovou hodnotou nějak vypořádat. Návratové kódy jsou často ignorovány. Nelze použít v init, v přetížených operátorech a pro funkce, které podle specifikací mají vracet něco jiného, než chybový kód. Chyby jako výjimky Jazyk musí obsahovat speciální podporu; v případě chyby se přeruší "normální" vykonávání programu a výjimka se propaguje až na místo, kde je ošetřena. Klady: Zápory: Flexibilita Kód může být jednodušší. O výjimky se nemusím starat všude, jen tam, kde vím, jak s ní naložit. Efektivita: podpora výjimek něco stojí. Složitější debugování alternativní řídicí struktura v kódu. Ošetření chyb v Pythonu >>> import this The Zen of Python, by Tim Peters [...] Errors should never pass silently. Unless explicitly silenced. [...] Python preferuje výjimky! (Nepoužívá chybové návratové kódy.) Jsou všude. Vestavěné do mnoha funkcí a protokolů. Co je výjimka v Pythonu? Objekt (odvozený od BaseException). Obvykle indikuje, že je něco špatně. (Ale ne všechny výjimky reprezentují chyby.) Výjimky, které nebyly nikde ošetřeny, vybublají až k uživateli do (Python) shellu.

Příklad: Syntaktická chyba In [1]: print'how are you') File "<ipython input 1 9c0f473cfb8a>", line 1 print'how are you') ^ SyntaxError: invalid syntax Příklad: porušení předpokladů o datech In [2]: a = [] a[5] # Předpokládá, že prvek na indexu 5 existuje. IndexError <ipython input 2 3c4cc7d0e911> in <module>() 1 a = [] > 2 a[5] # Předpokládá, že prvek na indexu 5 existuje. IndexError: list index out of range Příklad: porušení předpokladů o datech In [3]: tup = (1, 'a', True) tup[1] = 'b' # Předpokládá, že prvek na indexu 1 lze změnit TypeError <ipython input 3 ab4e3b3964aa> in <module>() 1 tup = (1, 'a', True) > 2 tup[1] = 'b' # Předpokládá, že prvek na indexu 1 lze změnit TypeError: 'tuple' object does not support item assignment Příklad: porušení předpokladů o parametru funkce In [4]: def square_num(number): """Return the square of a number""" return number * number # Předpokládá, že number je číslo

In [5]: print(square_num(3)) 9 In [6]: print(square_num('number')) TypeError <ipython input 6 ef60bf9dda2e> in <module>() > 1 print(square_num('number')) <ipython input 4 3d3f318576bf> in square_num(number) 1 def square_num(number): 2 """Return the square of a number""" > 3 return number * number # Předpokládá, že number je číslo TypeError: can't multiply sequence by non int of type 'str' Výchozí chybová hláška Dává vývojáři mnoho informací o tom, co se skutečně stalo: traceback (kde nastala chyba přes všechny úrovně zásobníku) typ chyby (třída) chybová zpráva Info, které potřebuje vývojář (k opravě kódu) není stejné jako info, které potřebuje uživatel/admin (k opravě vstupních dat/prostředí)! Nikdy neukazujte traceback uživateli! K ničemu mu není. Archivujte ho, pošlete si ho emailem,... Chybové hlášky pro uživatele vytvářejte pečlivě! Zaměřte se na to, co uživatel může udělat. Pokud je to vhodné, restartujte program. Indikace chybového stavu vyhozením výjimky Definujme jednoduchou funkci, která kontroluje přípustnost zadané hodnoty. In [7]: def ask_for_age(): age = int(input('enter your age:')) if age < 0: raise ValueError('{} is not valid age'.format(age)) return age Pokud je hodnota v pořádku, neděje se nic zvláštního:

In [8]: ask_for_age() Enter your age:20 Out[8]: 20 Pokud je zadána nesmyslná hodnota, vyhodí se výjimka (protože jsme se o to postarali): In [9]: ask_for_age() Enter your age: 3 ValueError <ipython input 9 38a44bff3cde> in <module>() > 1 ask_for_age() <ipython input 7 87c4808698fe> in ask_for_age() 2 age = int(input('enter your age:')) 3 if age < 0: > 4 raise ValueError('{} is not valid age'.format(age)) 5 return age ValueError: 3 is not valid age Pokud je zadána hodnota, která se nedá převést na číslo, postará se o vyhození výjimky Python ve funkci int(): In [10]: ask_for_age() Enter your age:your age ValueError <ipython input 10 38a44bff3cde> in <module>() > 1 ask_for_age() <ipython input 7 87c4808698fe> in ask_for_age() 1 def ask_for_age(): > 2 age = int(input('enter your age:')) 3 if age < 0: 4 raise ValueError('{} is not valid age'.format(age)) 5 return age ValueError: invalid literal for int() with base 10: 'your age' Tyto výjimky by ovšem uživatel neměl vidět, jsou to informace pro nás! Zpracování výjimek

Zpracování výjimek Ke zpracování výjimek se v Pythonu používá příkaz try except else finally: try: # Protected code which may raise an exception except <ExceptionType> as ex: # Handle exception ex else: # Code which executes if no exception is raised finally: # Code which executes in any case Vytvořme lepší funkci pro zadání věku, která uživateli příp. sdělí, co je špatně, a zeptá se jej znovu: In [11]: def ask_for_age_better(): while True: try: age = ask_for_age() except ValueError as ex: print(ex) else: break return age In [12]: ask_for_age_better() Enter your age:your age invalid literal for int() with base 10: 'your age' Enter your age: 3 3 is not valid age Enter your age:20 Out[12]: 20