Andrise programmeerimisalane WIKI

Veahaldus ja erindid

Erind (exception) on märguanne, mis teatab erijuhu või vea tekimisest ning üldjuhul tähendab see mingisugust tõrkeolukorda. Käsuga throw saab tekitada uue erindi ning lausega catch saab selle kinni püüda. Kui erind ei ole kontrollitud (tekib väljaspool try blokki), peatab see terve programmi edasise töö.

throw

throw tekitab veaobjekti ning lõpetab sellega programmi töö täitmise. Juhul kui throw asub try blokis, lõpetatakse bloki töö ja edastatakse veaobjekt catch blokile (juhul kui on seatud) ilma programmi enda täitmist segamata.

throw new ReferenceError("Muutuja on seadmata!");
try{
    throw new Error("Ilmnes viga!");
}catch(err){
    alert(err.message); // Ilmnes viga!
}

Error

Veatüüpe on erinevaid - Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError. Sisuliselt on tegemist sarnaste objektidega, välja arvatud objekti omadus name, mis on võrdne vea tüübi nimega.

Näiteks SyntaxError veaobjekti name omaduse väärtus on "SyntaxError" ning RangeError objekti name omaduse väärtus on "RangeError". See eristumine on vajalik catch blokis vea põhjuse määramiseks.

try{
    abc; //ReferenceError
}catch(E){
    alert('Ilmus '+E.name+' tüüpi viga!');
}

Veaobjekti deklareerimine:

new Error([teade [,failiNimi [,reaNumber]]);

ning reeglina käib see käskluse throw juurde.

Veaobjekt koosneb järgmistest elementidest:

  • name - tähistab vea tüüpi stringi kujul ("Error", "ReferenceError" jne)
  • message - vabas vormis tekst selgitusega vea tekkimise kohta (selleks saab veaobjekti luues new Error(msg); parameeter msg)
  • fileName - faili URL, milles viga tekkis
  • lineNumber - rida programmis, kus viga tekkis

Veatüüpidest saab täpsemalt lugeda globaalsete objektide peatükist.

try/catch/finally

try blokk võimaldab „proovida“ soovitud käsklusi. Kui blokis peaks ilmnema mingi viga, ei lõpetata programmi tööd, vaid antakse info vea kohta edasi blokile catch. Lõpuks (hoolimata vea tekkimisest/mittetekkimisest) antakse järg üle blokile finally. catch ja finally blokid pole struktuuris kohustuslikud, kuid vähemalt üks neist peab try blokile järgnema.

try{
    // proovime mingeid käsklusi
}catch(err){
    // käivitub kui try blokis oli viga
}finally{
    // käivitub igal juhul
}

catch blokile edastatav parameeter err on Error objekt, mis sisaldab endas tekstikujulist selgitust vea ilmnemise ning vea tüübi kohta.

onError sündmus

Brauseris käivitatava JavaScripti puhul on võimalik kasutada onError sündmuse seadmist. Sellisel juhul suunatakse kõik erindid sellele sündmuse juhtijale.

window.onerror = function(err, url, code){
    // err - veaobjekt
    // url - fail, milles viga ilmnes
    // code - rea number
    return true;
}

Juhul kui sündmust haldav funktsioon tagastab tõese väärtuse (true), jätkab programm tööd, vastupidisel juhul töö lõpetatakse.

Juhul kui onError sündmus seatakse HTML koodis

<body onerror = "alert('ilmnes viga!');...">

saab eelpool näidatud parameetritele err, url ja code ligi arguments objektiga (arguments[0], arguments[1] ja arguments[2]).

Sündmusega onError erindeid kinni püüda pole siiski eriti soovituslik. Mõistlikum oleks kasutada try/catch blokke, sellisel juhul oleks pikemas programmis viga tunduvalt kergem lokaliseerida ja hallata.