Obradi očekivani problem tokom izvršavanja, a zatim nastavi program.
Već poznaješ operacije koje mogu uspeti ili ne uspeti. int("42") radi, dok int("abc") ne može taj tekst da pretvori u ceo broj. Slično tome, 10 / 2 radi, ali 10 / 0 izaziva problem dok se program izvršava. Koristi try i except kada program očekuje određeni problem tokom izvršavanja i zna kako da ga obradi.
value = "abc"
try:
number = int(value)
print(number)
except ValueError:
print("Please enter a valid number.")Python ulazi u try i pokušava int(value). Ovde int("abc") izaziva ValueError, pa Python preskače preostale linije u tom try bloku, pronalazi odgovarajući except ValueError i izvršava njegovu poruku. Kod posle cele try/except strukture zatim može da nastavi izvršavanje.
Please enter a valid number.Razdvoji sintaksne greške od izuzetaka tokom izvršavanja. Sintaksna greška znači da Python ne može pravilno da pročita napisani kod, kao print("Hello" sa nedostajućom zagradom. Izuzetak nastaje dok se sintaksno ispravan kod izvršava, kao int("abc"). try/except obrađuje očekivane izuzetke tokom izvršavanja; ne popravlja neispravnu Python sintaksu.
Koristi ovaj mentalni model za obradu grešaka: rizična operacija → nastaje izuzetak → odgovarajući except ga obrađuje → program nastavlja dalje
value = "12"
try:
number = int(value)
print(number)
except ValueError:
print("Please enter a valid number.")
print("Program continues.")int("12") uspeva, pa se ostatak try bloka izvršava i ispisuje 12. Ne nastaje ValueError, zato se taj except blok preskače. Python zatim stiže do print("Program continues."). except blok se ne izvršava svaki put; izvršava se samo kada nastane njegov odgovarajući izuzetak.
int("42")
int("abc")Oba ulaza su stringovi, ali "42" može postati ceo broj, a "abc" ne može. U ovoj lekciji čitaj ValueError kao koristan signal da se vrednost ne može obraditi na traženi način.
number = 10
try:
print(number / 0)
except ZeroDivisionError:
print("Cannot divide by zero.")Deljenje nulom izaziva ZeroDivisionError, a ne ValueError. Različiti očekivani problemi imaju različite tipove izuzetaka, zato izaberi obradu koja odgovara operaciji koju štitiš.
value = "5"
try:
number = int(value)
print(10 / number)
except ValueError:
print("Please enter a number.")
except ZeroDivisionError:
print("Cannot divide by zero.")Sa "5" pretvaranje i deljenje uspevaju, pa se nijedna grana za obradu ne izvršava. Sa "abc" pretvaranje izaziva ValueError. Sa "0" pretvaranje uspeva, ali deljenje izaziva ZeroDivisionError. Python bira odgovarajuću except granu za problem koji je nastao.
value = "0"
try:
number = int(value)
result = 10 / number
print(result)
except ValueError:
print("Invalid number.")
except ZeroDivisionError:
print("Cannot divide by zero.")
print("Done.")Prati tok: int("0") vraća 0, zatim 10 / 0 izaziva ZeroDivisionError. Python preskače print(result), izvršava odgovarajuću obradu, ispisuje "Cannot divide by zero.", a zatim nastavlja posle strukture i ispisuje "Done.".
except ValueError:
print("Please enter a valid number.")Konkretna obrada pokazuje šta program očekuje i kako će odgovoriti. Hvatanje svega bez jasnog razloga može sakriti drugi, neočekivani problem, zato počni od konkretnih grešaka koje tvoj kod može smisleno da obradi.
Praktičan kontrolni spisak za čitanje obrade grešaka
- Pronađi rizičnu operacijuKoja operacija u
trybloku može da ne uspe dok se izvršava? - Prepoznaj očekivani izuzetakDa li ova operacija može izazvati
ValueError,ZeroDivisionErrorili nijedan od njih? - Prati try blokKoje se linije uspešno izvršavaju pre nego što nastane izuzetak, ako nastane?
- Pronađi odgovarajući exceptKoja
exceptgrana odgovara izuzetku koji je nastao? - Preskoči ostatak try bloka nakon izuzetkaNakon izuzetka Python napušta preostale naredbe u tom
trybloku. - Nastavi posle try/exceptKoji se kod izvršava sledeći nakon završetka odgovarajuće grane ili nakon što nijedan izuzetak nije nastao?
Česte početničke greške
- Pretpostavljanje da se except uvek izvršavaBlok
exceptizvršava se samo kada nastane njegov odgovarajući izuzetak. - Očekivanje da try/except popravlja sintaksne greškePython sintaksa mora biti ispravna pre nego što obrada grešaka tokom izvršavanja može da se pokrene.
- Hvatanje pogrešnog tipa izuzetka
ValueErrorne obrađujeZeroDivisionError; uskladi obradu sa očekivanim problemom. - Očekivanje da se sledeća linija unutar try izvrši nakon izuzetkaKada nastane izuzetak, Python preskače preostale naredbe u tom
trybloku. - Hvatanje svega bez jasnog razlogaDaj prednost konkretnim očekivanim greškama koje program može jasno da obradi.
- Zaboravljanje da izvršavanje može da se nastavi nakon togaNakon završetka odgovarajuće obrade, kod posle
try/exceptstrukture i dalje može da se izvršava.
