Erand vs viga
Programmi käitamisel ilmneb kindlasti ootamatu käitumine. Selle põhjuseks võivad olla erandid või vead. Erandiks on sündmused, mis võivad häirida tavapärast programmivoogu. Vead on tingimused, mida võib pidada tagastamatuteks. Erandid on enamasti seotud rakendusega ise, samas kui vead on seotud süsteemiga, milles programm töötab.
Mis on erand?
Erand on sündmus, mis võib häirida tavapärast programmivoogu. Nime erand tuleneb „erandlikust sündmusest“. Erandi viskamine on erandobjekti loomise ja käitamissüsteemile üleandmise protsess. Erandiobjekt luuakse meetodi abil, milles erand tehti. Erandiobjekt sisaldab kasulikku teavet, näiteks erandi tüüp ja kirjeldus. Kui käitustõmmise süsteem võtab erandobjekti vastu, proovib ta leida kõnekõnes keegi, kes seda käsitseks, liikudes vastupidises järjekorras (milles meetodeid kutsuti). Kõnede pinu on järjestatud meetodite loend, mida kutsuti enne meetodit, milles erand tehti. Kätlussüsteem on edukas, kui see leiab meetodi erandkäitlejaga. Erandkäitleja on koodiplokk, mis saab nimetatud erandiga ametlikult hakkama. Kui käitamissüsteem leiab sobiva käitleja (st erandi tüüp sobib sellega, mida saab käsitleda), edastab see erandiobjekti käitlejale. Seda nimetatakse erandi püüdmiseks. Kui erandit ei saa siiski lahendada, lõpetatakse programm. Jaavas pärivad erandid kategooriast „Throvable class”. NullPointerException ja ArrayIndexOutOfBoundsException on Java kaks levinumat erandit.
Mis on viga?
Viga on seisund, mida võib pidada taastamatuks, näiteks programm, mis nõuab saadaolevast suuremat mälumahtu. Neid tõrkeid ei saa käitusel lahendada. Vea ilmnemisel programm lõpeb. Java keeles pärivad vead Throvable klassist. Vead tähistavad tavaliselt tõsiseid probleeme, mida programmeerija (või rakendus) ei tohiks proovida. Vead on lihtsalt ebanormaalsed tingimused, mida tavaolukorras kunagi ei juhtu ja mida seetõttu kunagi ette ei nähta. Näiteks OutOfMemoryError, StackOverflowError ja ThreadDead on sellised vead. Meetoditel ei tohiks kunagi olla vigade töötlejaid.
Mis vahe on erandil ja veal??
Nii vead kui ka erandid on programmi täitmise ajal soovimatud esinemised. Neil on siiski peamised erinevused. Programmeerija võib ette näha erandeid, samas kui viga on raske ette näha. Erandeid saab kontrollida või nende märkimata jätta. Kuid vead on alati märkimata. Erandid näitavad tavaliselt programmeerija põhjustatud tõrget. Kuid vead tekivad süsteemivea või ressursi sobimatu kasutamise tõttu. Seetõttu tuleks erandeid käsitleda rakendustasandil, samas kui vigade eest tuleks hoolitseda süsteemi tasandil (ainult juhul, kui see on võimalik). Pärast erandi käsitlemist naasete programmi tavapärasesse voogu. Kuid isegi kui viga on tabatud, ei pruugi programmeerija kõigepealt teada, kuidas sellega hakkama saada. Erinevalt tavapärasest tõrkekäsitlusest võimaldavad erandid veakäsitluskoodi tavalisest koodist eraldada.