Eranditöötlus

Eranditöötlus on konstruktsioon programmeerimiskeeltes või mehhanism riistvaras, mille abil saab tuvastada ja töödelda erandeid ehk arvutiprogrammi töös tekkinud eriolukordi.

Erandid võivad tekkida näiteks siis, kui programm üritab lugeda kättesaamatut mälupiirkonda, avada faili, mida ei ole olemas, või jagada arvu nulliga. Erandi tekkimisel käivitatakse eranditöötleja ehk vastav programmilõik, mis üritab viga parandada või annab veateate.

Sõltuvalt olukorrast võib programm pärast erandi töötlemist jätkata tööd sealt, kus see pooleli jäi.

Markantne näide eranditöötluse puudumisest on Ameerika Ühendriikide mereväe ristleja USS Yorktown süsteeme kontrolliva arvutivõrgu kokkujooksmine nulliga jagamise tõttu.

Kasutamine programmeerimises muuda

Erinevates programmeerimiskeeltes on eranditöötlus erinev.

Tavaliselt piiritletakse kood, milles võib erand tekkida, try-plokki. Sellele järgneb eranditöötleja catch-plokis. Mõnedes programmeerimiskeeltes saab kirjutada ka finally-ploki, milles olev kood käivitatakse sõltumata sellest, kas erand töödeldi või mitte. Selles saab vabastada try-plokis kasutatud ressursid. Erand tekitatakse käsuga throw, või tekib see kaudselt (nt. nulliga jagamine).

Erandi tekkimisel hakatakse otsima eranditöötlejat liikudes pinus ülespoole. Kui funktsioon, milles erand tekkis, ei sisalda eranditöötlejat, siis vaadatakse antud funktsiooni välja kutsunud funktsiooni jne.

Erandi töötlemine keeles C# muuda

See koodilõik üritab avada faili nimega "fail.txt". Kui seda ei leita või tekkis mõni muu failiga seotud viga, siis tekitatakse spetsiaalne sisend-väljundoperatsioonide erand IOException. Kui faili pikkus on null, siis tekitab programm ise erandi. Eranditöötleja "püüab" erandi, mis vastab tekkinud veale ja trükib konsoolile veateate. Lõpuks sulgetakse fail, kui selle avamine õnnestus.

FileStream f = null;
try
{
    f = File.Open("fail.txt", FileMode.Open);
    if (f.Length == 0)
        throw new Exception("Fail on tühi");
    Console.WriteLine("Programm jooksis edukalt");
}
catch (IOException)
{
    Console.WriteLine("Erandi töötlemine");
    Console.WriteLine("Faili ei saanud avada");
}
catch (Exception e)
{
    Console.WriteLine("Erandi töötlemine");
    Console.WriteLine("Muu viga: " + e.Message);
}
finally
{
    if (f != null)
        f.Close();
    Console.WriteLine("Programmi töö lõpp");
}

Vaata ka muuda