11.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M E>>> f.close() #zatvorime subor>>> sys.exit() #opustime Pytho<strong>na</strong>>>> import pickle>>> f=open(‘notes’,’r’)>>> telcisla=pickle.load(f){‘robert’: ‘183 426’, ‘manfred’: ‘684 158’}Chyby a výnimkyS výnimkou odseku Zme<strong>na</strong> pozície v súbore som sa doteraz s<strong>na</strong>žil koncipova príklady tak,aby som nemusel uvádza chybové hlásenia Pytho<strong>na</strong>. Jedným z dôvodov bolo, že som vásnechcel iritova týmito chybovými hláseniami. Druhý bol priestorový dôvod. Na prvýpoh¾ad neukážu tieto hlásenia niè zaujímavé a zaberajú priemerne tri cenné riadky. Terazvám ukážem, že to tak celkom neplatí a že chybové hlásenia nás upozornia <strong>na</strong> ve¾adôležitých veci, výnimky sa môžu sta ve¾mi dobrým priate¾om programátora.Chyby syntaxePredstavujú <strong>na</strong>jèastejší druh chýb. Dopustíme sa ich, ak nieèo nesprávne <strong>na</strong>píšeme aPython <strong>na</strong>šej požiadavke neporozumie. Napríklad:>>> def funkcia() #zabudol som “:”File “”, line 1def funkcia()^SyntaxError: invalid syntaxV riadku pod <strong>na</strong>šou nesprávnou definíciou hneï za slovom File nájdeme údaj, v ktoromsúbore sa chyba stala. Ak uvidíme , z<strong>na</strong>èí to, že chyba sa stala pri interaktívnomvstupe (zadávania príkazov). Za slovom line vidíme, <strong>na</strong> ktorom riadku sa chyba stala. Vïalšom riadku uvidíme, kde v definícii sa chyba vy<strong>sk</strong>ytla. Python sa nám toto miesto s<strong>na</strong>žíukáza pomocou malej šípky (^).VýnimkyNie všetky chyby sú syntaktické. Aj keï je definícia syntakticky správ<strong>na</strong>, pri vykonávaníkódu môže dôjs k chybe. Takáto chyba sa potom volá výnimka a každá takáto výnimkamá svoje meno. Typickým príkladom výnimky je delenie nulou (ZeroDivisionError). Výraz,kde ho použijeme, je síce syntakticky správny, ale matematicky nemožný. Je možné definovavlastné výnimky. Na vytvorenie vlastnej výnimky budeme musie vedie , ako vytvoritriedu, èo bude témou ïalšej èasti seriálu. Príklady výnimiek:>>> 5/0 #delenie nulouTraceback (most recent call last):File “”, line 1, in ?ZeroDivisionError: integer division or modulo>>> preme<strong>na</strong>/4 #neexistujuca premen<strong>na</strong>Traceback (most recent call last):File “”, line 1, in ?NameError: There is no variable <strong>na</strong>med ‘preme<strong>na</strong>’Chybové hlásenie je podobné ako pri syntaktickej chybe. Prvé slovo posledného riadkatohto hlásenia ukazuje meno výnimky, ako <strong>na</strong>pr. ZeroDivisionError alebo NameError,zvyšok riadka tvorí opis chyby. Mená výnimiek sú vstavané (preddefinované) identifikátory,no nie sú to k¾úèové slová. Zoz<strong>na</strong>m a opis všetkých vstavaných výnimiek sa dá nájs vdokumentácii. Prvé dva údaje stredného riadka chybového hlásenia ukazujú, v ktoromsúbore a <strong>na</strong> ktorom riadku sa chyba stala. Zvyšok chybového hlásenia sa zaberá zásobníkoma je pre nás nezaujímavý.Spracovanie výnimiekKrása výnimiek spoèíva v tom, že sa dajú spracúva . Napríklad pri delení nulou pokojnemôžeme <strong>na</strong>písa používate¾ovi nášho programu, že nulou sa nesmie deli , a tým muušetri menej preh¾adné chybové hlásenie.>>> try:... 5/0... except ZeroDivisionError:... print “nulou sa nesmie delit!”...nulou sa nesmie delit!Všetko to funguje takto:l Blok medzi try: a except: sa vykoná,l ak sa nevy<strong>sk</strong>ytne nijaká výnimka, blok za try: sa vykoná a èas except je ignorovaná,l ak sa v priebehu vykonávania bloku za try: vy<strong>sk</strong>ytne výnimka, zvyšok bloku za výrazomtry: bude ignorovaný. Meno výnimky sa porovná s výnimkou/výnimkami uvedenými predvýrazom except:, a ak sa meno výnimky, ktorá sa vy<strong>sk</strong>ytla, zhoduje s me<strong>na</strong>mi uvedenýmipri except:, vykoná sa blok za except:.l V prípade vý<strong>sk</strong>ytu výnimky, ktorá nie je definovaná pri except:, bude vyvolané hlásenievy<strong>sk</strong>ytujúcej sa výnimky, akoby sa výrazy except: a try: nepoužili.Ako som už <strong>na</strong>z<strong>na</strong>èil, môžeme spracúva viaceré výnimky pomocou jediného výrazuexcept:, <strong>na</strong>pr. ak chceme ignorova delenie nulou (ZeroDivisionError) a výnimku použitiame<strong>na</strong> neexistujúcej premennej (NameError). V jednom výraze try: môže by viac výrazovexcept:, môžu by ukonèené príkazmi break alebo return. Ïalej platí, že except: nespracúvalen výnimky vy<strong>sk</strong>ytujúce sa priamo v bloku za výrazom try:, ale <strong>na</strong>pr. tie, ktoré savy<strong>sk</strong>ytnú vo funkciách vy<strong>sk</strong>ytujúcich sa v bloku za try:>>> def funkcia():... premen<strong>na</strong>/0...>>> try:... funkcia()... except:... print ‘vy<strong>sk</strong>ytla sa nejaka vynimka’...vy<strong>sk</strong>ytla sa nejaka vynimkaPoužitím osamostatneného výrazu except: bez argumentov (except:) spracúvame všetkyvýnimky <strong>na</strong>raz. Takýto osamostatnený výraz except: odporúèam používa maximálne opatrnea zriedka, pretože tým môžeme ve¾mi ¾ahko prehliadnu chyby v <strong>na</strong>šich programoch.Výraz try..except môže ma aj èas else: (podobne ako if, while alebo <strong>na</strong>pr. for), ktorása vykoná, ak sa vy<strong>sk</strong>ytne výnimka, ktorá nie je uvedená pri výraze except:for arg in sys.argv[1:]:try:f=open(arg, ‘r’) #otvorime subor predanky ako argument<strong>na</strong> citanieexcept IOError:print ‘nemozem otvorit’, arg #subor neexistujeelse:print arg, ‘ma’, len(f.readlines()), ‘lines’ #ak savy<strong>sk</strong>ytne i<strong>na</strong> vynimkaf.close()Argumenty výnimiekPri niektorých výnimkách je možné uvies argument/y. Takýto argument je väèšinou èaschybového hlásenia uvedeného za menom chyby.>>> try:... f=open(‘subor.test’)... except IOError, x:... print ‘chybove hlasenie znie:’, x...chybove hlasenie znie: [Errno 2] Adresár alebo súbor neexistuje: ‘subor.test’Vyvolávanie výnimiekPomocou výrazu raise môžeme prinúti Python vyvola ¾ubovo¾nú výnimku. Prvý argumentraise je meno výnimky, druhý je argument samotnej výnimky:>>> raise IOError, ‘mnou vyvola<strong>na</strong> vynimka’Traceback (most recent call last):File “”, line 1, in ?IOError: mnou vyvola<strong>na</strong> vynimkafi<strong>na</strong>lly:Výraz fi<strong>na</strong>lly: je špeciál<strong>na</strong> èas výrazu try:, ktorá sa vykoná v každom prípade, nezáleží <strong>na</strong>tom, èi sa blok try: opustí pomocou príkazu break alebo return, takisto je jedno, èi savy<strong>sk</strong>ytla výnimka, alebo nie. Blok za výrazom fi<strong>na</strong>lly: sa jednoducho vykoná za všetkýchokolností.>>> try:... f=open(‘subor.test’)... fi<strong>na</strong>lly:... print ‘toto sa zobrazi v kazdom pripade’...toto sa zobrazi v kazdom pripadeTraceback (most recent call last):File “”, line 2, in ?IOError: [Errno 2] Adresár alebo súbor neexistuje: ‘subor.test’Jeden výraz try: môže ma jeden alebo viac výrazov except: alebo jeden výraz fi<strong>na</strong>lly:. Musíma však pri<strong>na</strong>jmenšom aspoò jednu z týchto dvoch èastí a nesmie ich ma obidve <strong>na</strong>raz.Nabudúce:Preberieme poslednú, rozhodne <strong>na</strong>jdôležitejšiu a <strong>na</strong>jzaujímavejšiu tému – objektovo orientovanéprogramovanie v podaní Pytho<strong>na</strong>.Príjemné prežitie vianoèných sviatkov prajen Martin Užákuzak@ba.telecom.<strong>sk</strong>12/2000 PC REVUE 127

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!