{"id":599,"date":"2025-12-12T12:54:37","date_gmt":"2025-12-12T12:54:37","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=599"},"modified":"2025-12-12T13:04:53","modified_gmt":"2025-12-12T13:04:53","slug":"lisalugemine-erindid","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/lisalugemine-erindid\/","title":{"raw":"Lisalugemine: erindid","rendered":"Lisalugemine: erindid"},"content":{"raw":"<p class=\"vspace\">Vaatame \u00fchte l\u00fchikest ja lihtsat programmi:<\/p>\r\n<p class=\"vspace\">N\u00fc\u00fcd on vaja kontrollida, kas parool on \u00f5ige v\u00f5i ei ole. Selleks saab kasutada <strong>tingimuslauset<\/strong>:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">arv1 = float(input(\"Sisesta esimene arv: \"))\r\narv2 = float(input(\"Sisesta teine arv: \"))\r\nprint(f\"Nende arvude jagatis on {arv1 \/ arv2}\")<\/pre>\r\n<p class=\"vspace\">Mis juhtub siis, kui kasutaja sisestab \u00fche soovitud arvu (nt. 45) asemel kogemata midagi, millest Python ei oska arvu v\u00e4lja lugeda (n\u00e4iteks 45t)? Proovi j\u00e4rele!<\/p>\r\n<p class=\"vspace\">Ilmselt n\u00e4gid, et Python v\u00e4ljastas ekraanile veateate, ning l\u00f5petas programmi t\u00f6\u00f6. Selle programmi puhul polnud see suur \u00f5nnetus, aga keerulisemates programmides, kus kasutaja on suure \u00fclesandega poole peale j\u00f5udnud, on kahju kui selline viga programmi veateatega sulgeb. Seet\u00f5ttu on Pythonisse loodud v\u00f5imalused t\u00e4itmisaegsete vigade e erindite \u201ep\u00fc\u00fcdmiseks\u201c.<\/p>\r\n<p class=\"vspace\">Vigade p\u00fc\u00fcdimiseks tuleb kasutada <em>try<\/em>-lauset. Alustame n\u00e4itest:<\/p>\r\n\r\n<div class=\"vspace\">\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">try:\r\n\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\nexcept:\r\n\u00a0\u00a0\u00a0\u00a0print(\"Hmm..., midagi l\u00e4ks vussi.\")<\/pre>\r\n<\/div>\r\n<p class=\"vspace\">Nii nagu if-else-lause, koosneb ka <em>try<\/em>-lause mitmest osast \u2013 v\u00f5tmes\u00f5na <em>try<\/em> alla kirjutatakse laused, mida soovitakse normaalsel juhul t\u00e4ita ning v\u00f5tmes\u00f5na except alla laused, mida t\u00e4idetakse siis, kui <em>try<\/em>-osa lausete t\u00e4itmisel tekib mingi viga (siit ka v\u00f5tmes\u00f5na except \u2013 neid lauseid soovime t\u00e4ita vaid erandjuhtumitel).<\/p>\r\n<p class=\"vspace\">Selle n\u00e4ite puhul on k\u00fcsitav, kuiv\u00f5rd <em>try<\/em>-lause lisamine midagi paremaks tegi \u2013 me k\u00fcll peitsime kasutaja eest \u00e4ra koleda mitmerealise veateate (kas see peitmine oli \u00fcldse hea?), aga vigase sisestuse korral j\u00e4i kasutaja ikkagi vastusest ilma. Koodi \u00fcmber paigutades saame me aga programmi, mis k\u00fcsib kasutajalt arve niikaua, kuni l\u00f5puks teisendamine ja jagamine \u00f5nnestub. P\u00fc\u00fcame ka kinni konkreetse veateate <code>ValueError<\/code>:<\/p>\r\n\r\n<div class=\"vspace\">\r\n<div class=\"vspace\">\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">j\u00e4tkub = True\r\nwhile j\u00e4tkub:\r\n\u00a0\u00a0\u00a0\u00a0try:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = False\r\n\u00a0\u00a0\u00a0\u00a0except ValueError:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Sisestage korrektne arv.\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Proovime uuesti!\")<\/pre>\r\n<\/div>\r\n<\/div>\r\n<p class=\"vspace\">Siin me panime kogu programmi loogika ts\u00fcklisse, millest p\u00e4\u00e4seb v\u00e4lja muutes ts\u00fckli j\u00e4tkutingimuse v\u00e4\u00e4rtuseks <code>False<\/code>. Selle k\u00e4suni j\u00f5uab Python aga ainult siis, kui k\u00f5ik <em>try<\/em>-osa laused edukalt l\u00e4bitakse \u2013 niipea, kui kusagil eespool tekib mingi viga, h\u00fcpatakse kohe <em>except<\/em>-osasse, kus p\u00fc\u00fctakse kinni ValueError ning peale selle t\u00e4itmist j\u00e4tkatakse uuesti ts\u00fckli algusest.<\/p>\r\n<p class=\"vspace\">Kui me tahame selle ts\u00fckliprogrammi kenasti p\u00f5hifunktsiooni sisse panna, siis peaksime koostama <code>main<\/code>-funktsioonia ja kutsuma selle v\u00e4lja programmi l\u00f5pus. Selliselt tuleb meeles pidada, et k\u00f5ik read, mis l\u00e4hevad <code>main<\/code>-funktsiooni sisse, peavad algama taandega:<\/p>\r\n\r\n<div class=\"vspace\">\r\n<div class=\"vspace\">\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def main():\r\n\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = True\r\n\u00a0\u00a0\u00a0\u00a0while j\u00e4tkub:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = False\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0except ValueError:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Sisestage korrektne arv.\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Proovime uuesti!\")\r\nif __name__ == \"__main__\":\r\n    main()<\/pre>\r\n<\/div>\r\n<\/div>\r\n<p class=\"vspace\"><strong>Hoiatus!<\/strong><\/p>\r\n<p class=\"vspace\">Vigade kinnip\u00fc\u00fcdmine on p\u00f5hjendatud ainult siis, kui sa t\u00f5esti oskad selle veasituatsiooniga midagi ette v\u00f5tta. Vigu ei tohiks p\u00fc\u00fcda kinni lihtsalt selleks, et v\u00e4ltida veateate ekraanile j\u00f5udmist \u2013 see v\u00f5ib tekitada situatsiooni, kus programmis on mingi probleem, aga ei programmeerija ega kasutaja ei saa sellest teada ning programm annab s\u00fc\u00fcdimatult v\u00e4lja valed tulemused. Seep\u00e4rast ongi hea harjumus p\u00fc\u00fcda kinni konkreetsed veateated (nt <code>ValueError<\/code>) ja anda vastav tagasiside. N\u00e4iteks nulliga jagades v\u00f5ib juhtuda ka <code>ZeroDivisionError<\/code>, mille v\u00f5iks eraldi kinni p\u00fc\u00fcda ja anda ka vastav tagasiside.<\/p>\r\n\r\n<h2>Video<\/h2>\r\nKui soovid rohkem teada saada erijuhtude k\u00e4sitlemisest, siis vaata videot:\r\n\r\nhttps:\/\/www.youtube.com\/watch?v=Q9RLVH5TXG0","rendered":"<p class=\"vspace\">Vaatame \u00fchte l\u00fchikest ja lihtsat programmi:<\/p>\n<p class=\"vspace\">N\u00fc\u00fcd on vaja kontrollida, kas parool on \u00f5ige v\u00f5i ei ole. Selleks saab kasutada <strong>tingimuslauset<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">arv1 = float(input(\"Sisesta esimene arv: \"))\r\narv2 = float(input(\"Sisesta teine arv: \"))\r\nprint(f\"Nende arvude jagatis on {arv1 \/ arv2}\")<\/pre>\n<p class=\"vspace\">Mis juhtub siis, kui kasutaja sisestab \u00fche soovitud arvu (nt. 45) asemel kogemata midagi, millest Python ei oska arvu v\u00e4lja lugeda (n\u00e4iteks 45t)? Proovi j\u00e4rele!<\/p>\n<p class=\"vspace\">Ilmselt n\u00e4gid, et Python v\u00e4ljastas ekraanile veateate, ning l\u00f5petas programmi t\u00f6\u00f6. Selle programmi puhul polnud see suur \u00f5nnetus, aga keerulisemates programmides, kus kasutaja on suure \u00fclesandega poole peale j\u00f5udnud, on kahju kui selline viga programmi veateatega sulgeb. Seet\u00f5ttu on Pythonisse loodud v\u00f5imalused t\u00e4itmisaegsete vigade e erindite \u201ep\u00fc\u00fcdmiseks\u201c.<\/p>\n<p class=\"vspace\">Vigade p\u00fc\u00fcdimiseks tuleb kasutada <em>try<\/em>-lauset. Alustame n\u00e4itest:<\/p>\n<div class=\"vspace\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">try:\r\n\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\nexcept:\r\n\u00a0\u00a0\u00a0\u00a0print(\"Hmm..., midagi l\u00e4ks vussi.\")<\/pre>\n<\/div>\n<p class=\"vspace\">Nii nagu if-else-lause, koosneb ka <em>try<\/em>-lause mitmest osast \u2013 v\u00f5tmes\u00f5na <em>try<\/em> alla kirjutatakse laused, mida soovitakse normaalsel juhul t\u00e4ita ning v\u00f5tmes\u00f5na except alla laused, mida t\u00e4idetakse siis, kui <em>try<\/em>-osa lausete t\u00e4itmisel tekib mingi viga (siit ka v\u00f5tmes\u00f5na except \u2013 neid lauseid soovime t\u00e4ita vaid erandjuhtumitel).<\/p>\n<p class=\"vspace\">Selle n\u00e4ite puhul on k\u00fcsitav, kuiv\u00f5rd <em>try<\/em>-lause lisamine midagi paremaks tegi \u2013 me k\u00fcll peitsime kasutaja eest \u00e4ra koleda mitmerealise veateate (kas see peitmine oli \u00fcldse hea?), aga vigase sisestuse korral j\u00e4i kasutaja ikkagi vastusest ilma. Koodi \u00fcmber paigutades saame me aga programmi, mis k\u00fcsib kasutajalt arve niikaua, kuni l\u00f5puks teisendamine ja jagamine \u00f5nnestub. P\u00fc\u00fcame ka kinni konkreetse veateate <code>ValueError<\/code>:<\/p>\n<div class=\"vspace\">\n<div class=\"vspace\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">j\u00e4tkub = True\r\nwhile j\u00e4tkub:\r\n\u00a0\u00a0\u00a0\u00a0try:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = False\r\n\u00a0\u00a0\u00a0\u00a0except ValueError:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Sisestage korrektne arv.\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Proovime uuesti!\")<\/pre>\n<\/div>\n<\/div>\n<p class=\"vspace\">Siin me panime kogu programmi loogika ts\u00fcklisse, millest p\u00e4\u00e4seb v\u00e4lja muutes ts\u00fckli j\u00e4tkutingimuse v\u00e4\u00e4rtuseks <code>False<\/code>. Selle k\u00e4suni j\u00f5uab Python aga ainult siis, kui k\u00f5ik <em>try<\/em>-osa laused edukalt l\u00e4bitakse \u2013 niipea, kui kusagil eespool tekib mingi viga, h\u00fcpatakse kohe <em>except<\/em>-osasse, kus p\u00fc\u00fctakse kinni ValueError ning peale selle t\u00e4itmist j\u00e4tkatakse uuesti ts\u00fckli algusest.<\/p>\n<p class=\"vspace\">Kui me tahame selle ts\u00fckliprogrammi kenasti p\u00f5hifunktsiooni sisse panna, siis peaksime koostama <code>main<\/code>-funktsioonia ja kutsuma selle v\u00e4lja programmi l\u00f5pus. Selliselt tuleb meeles pidada, et k\u00f5ik read, mis l\u00e4hevad <code>main<\/code>-funktsiooni sisse, peavad algama taandega:<\/p>\n<div class=\"vspace\">\n<div class=\"vspace\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def main():\r\n\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = True\r\n\u00a0\u00a0\u00a0\u00a0while j\u00e4tkub:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv1 = float(input(\"Sisesta esimene arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arv2 = float(input(\"Sisesta teine arv: \"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Nende arvude jagatis on {arv1 \/ arv2}\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0j\u00e4tkub = False\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0except ValueError:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Sisestage korrektne arv.\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Proovime uuesti!\")\r\nif __name__ == \"__main__\":\r\n    main()<\/pre>\n<\/div>\n<\/div>\n<p class=\"vspace\"><strong>Hoiatus!<\/strong><\/p>\n<p class=\"vspace\">Vigade kinnip\u00fc\u00fcdmine on p\u00f5hjendatud ainult siis, kui sa t\u00f5esti oskad selle veasituatsiooniga midagi ette v\u00f5tta. Vigu ei tohiks p\u00fc\u00fcda kinni lihtsalt selleks, et v\u00e4ltida veateate ekraanile j\u00f5udmist \u2013 see v\u00f5ib tekitada situatsiooni, kus programmis on mingi probleem, aga ei programmeerija ega kasutaja ei saa sellest teada ning programm annab s\u00fc\u00fcdimatult v\u00e4lja valed tulemused. Seep\u00e4rast ongi hea harjumus p\u00fc\u00fcda kinni konkreetsed veateated (nt <code>ValueError<\/code>) ja anda vastav tagasiside. N\u00e4iteks nulliga jagades v\u00f5ib juhtuda ka <code>ZeroDivisionError<\/code>, mille v\u00f5iks eraldi kinni p\u00fc\u00fcda ja anda ka vastav tagasiside.<\/p>\n<h2>Video<\/h2>\n<p>Kui soovid rohkem teada saada erijuhtude k\u00e4sitlemisest, siis vaata videot:<\/p>\n<p><iframe loading=\"lazy\" id=\"oembed-1\" title=\"Informaatika valikkursus g\u00fcmnaasiumile - Erijuhtude k\u00e4sitlemine\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Q9RLVH5TXG0?feature=oembed&#38;rel=0\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"author":17,"menu_order":6,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-599","chapter","type-chapter","status-publish","hentry"],"part":233,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/17"}],"version-history":[{"count":4,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/599\/revisions"}],"predecessor-version":[{"id":603,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/599\/revisions\/603"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/233"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/599\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=599"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=599"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=599"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}