Čas 9

 

C# naredbe za upravljanje izuzecima i greškama

Jezik C# koristi naredbe izuzeća (excpetions) da pomoću njih upravlja specijalnim situacijama (izuzetcima) i greškama. Izuzeci su pojavljivanja slučajeva koji zahtevaju promenu normalnog toka izvršavanja programa. Izuzeci nastaju na primer kada vaš program izađe izvan okvira raspoložive memorije računara, kada pokušate da otvorite za čitanje fajl koji ne postoji, kada “padne” računarska mreža preko koje pristupate nekom resursu mreže u vašem program i druge slične situacije. Preciznije govoreći takve situacije predstavljaju greške izvršavanja programa ( Runtime Errors ) koje nastaju ne kao posledica sintaksne ili logičke greške u vašem program, već kao posledica nekih nepredvidivih okolnosti zbog kojih bi program mogao da da pogrešne rezultate ili da prekine rad.

U .NET jezicima ( C# i drugim) upravljanje strukturnim izuzecima (Structured Exceptions) je fundamentalni deo zajedničkog izvršnog okruženja za sve jezike, CLR (Common Language Runtime). Svi izuzeci (Exceptions) u CLR-u su izvedeni iz jedni bazične klase, a vi takođe možete kreirati vlastitu klasu izuzetaka za one izuzetke koji nisu pokriveni bazičnom Exception klasom.

C# koristi ključne reči try, catch i finally da pomoću kojih se pokušava izvršavanje neke programske akcije (pomoću reči try), pa kao je akcija nemoguća pomoću reči catch se izvršava alternativna procedura in a kraju pomoću reči finally vrši dodatno “čišćenje” resursra koji su eventualno “stradali” nakon neuspešnog pokušaja u try delu.

Na primer

 

  try

  {

          // vaš kod (jedna ili više naredbi)

  }

  Catch (tip izuzeća)

  {

          // vaš kod (jedna ili više naredbi)

 

  }

    finally

  {

          //  vaš kod (jedna ili više naredbi)

  }

Finally blok je opcionalan. Kod u finally bloku će se izvršiti čak i ako se izuzetak ne pojavi, pa zato treba biti obazriv pri upotrebi.

 

Iz sledećeg C# programa možete lako razumeti kako funkcioniše try..catch naredba. U ovom program mi ćemo pokušati da delimo sa nulom, što naravno nije moguće i izazvaće odgovarajući izuzetak (Exception)

using System;
using System.Windows.Forms;
 
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                int broj = 100;
                int delilac = 0;
                int rezultat;
                rezultat = (broj / delilac);
                MessageBox.Show("Rezultat je  : " + rezultat);
            }
            catch (System.Exception  ex)
            {
                MessageBox.Show("Pojavio se izuzetak - detalji  : " + ex.ToString());
            }
            finally
            {
                MessageBox.Show(" Ušli smo u finalni blok ");
            }
        }
    }
}

Kada izvršite gornji C# program, zbog deljenja sa nulom, pojaviće se izuzetak DividedByZero Exception,  na kraju će biti izvršen i finally blok.

 

Zadaci za vežbu

 

1.      Modifikujte gornji program tako da umesto delilac = 0 bude delilac = 5. Izvršite program i uporedite sa nemodifikovanim programom.

 

2.      Napisati C# program (konzolni ili windows, po volji) u kojem se pokusava korišćenje varijable u nekom izrazu a da varijabla pre toga nije bila inicijalizirana.