Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Lecţia 7 - Tratarea excepţiilor

Un lucru foarte important atunci când se construieşte o aplicaţie este ca aceasta să nu conţină erori. La fel de important este ca un produs final să conţină mesaje de eroare adresate utilizatorului în cazul în care sunt introduse date eronate. Un exemplu foarte simplu este următorul:

Se citeşte un număr întreg k. Să se afişeze succesorul său.

Secvenţa de program este descrisă mai jos. Remarcaţi modul în care a fost apelată funcţia TryParse. Al doilea parametru este o referinţă (k este precedat de cuvântul cheie out) pentru ca valoarea sa să fie păstrată (este asemănător ca transmiterea prin referinţă a unui parametru la C++).

string x;
int k;
x = Console.ReadLine();
if (Int32.TryParse(x,out k))
{
   Console.WriteLine("Succesorul lui {0} este {1}", k, k + 1);
}
else
{
   Console.WriteLine("Numarul citit nu este valid!");
}

Motivele pentru care un număr citit nu este corect pot fi mai multe. De exemplu, numărul natural este prea mare şi nu poate fi memorat într-o variabilă întreagă. Un alt motiv poate fi faptul că valoarea introdusă nu este numerică (am tastat din greşeală o literă). Am dori să aflăm totuşi mai precis ce am greşit la introducerea datelor. Din acest motiv, vom utiliza excepţiile. O excepţie reprezintă o eroare care intervine la momentul execuţiei unui program. In C# exceptiile se pot trata într-o manieră controlată, adică programatorul nu trebuie sa mai verifice manual daca o operaţie se execută sau nu cu succes. În C# sunt definite excepţii standard erorile obişnuite care pot apărea înrtr-un program. De exemplu: împărţire la zero, erori la conversii de date, memorie insuficientă etc.

Try – Catch – Finally

Cele trei cuvinte cheie corespund fiecare unui bloc de instrucţiuni. În blocul de instrucţiuni try se scriu instrucţiunile care pot provoca ("arunca" - throw) excepţii. Dacă excepţia se produce, blocul catch o "prinde" şi excepţia este tratată. De menţionat că pot exista mai multe blocuri catch. Blocul finally este opţional şi conţine instrucţiuni care se vor executa, indiferent dacă au apărut sau nu excepţii.

În exemplu de mai jos sunt tratate două excepţii care pot apărea la incercarea de a converti un string la întreg. Prima excepţie tratează cazul în care numărul convertit este prea mare şi nu poate fi memorat într-un întreg (OverflowException). A doua excepţie poate să aăară dacă datele convertite nu sunt numerice (FormatException). În cazul în care conversia nu a avut loc, valoarea afişată va fi 0.

int n = 0;
string s;
Console.Write("n = ");
s = Console.ReadLine();
try
{
   n = int.Parse(s);
}
catch (OverflowException)
{
   Console.WriteLine("Numarul citit este prea mare");
}
catch (FormatException)
{
   Console.WriteLine("Datele citite nu sunt numerice");
}
finally
{
   Console.WriteLine(n);
}

Următorul exemplu determină restul împărţirii a două numere naturale. Dacă împărţitorul este 0, atunci va fi aruncată o excepţie: DivideByZeroException.

static void Main(string[] args)
{
  int a, b, r = -1;
  a = int.Parse(Console.ReadLine());
  b = int.Parse(Console.ReadLine());
  Console.Write("Restul impartirii lui {0} la {1} : ", a, b);
  try
  {
    r = a % b;
  }
  catch (DivideByZeroException)
  {
    Console.WriteLine("Eroare. Impartire prin zero!");
  }
  finally
  {
    if (r >= 0) Console.WriteLine(r);
  }
}

Exemplul de mai jos va trata o altă excepţie, anume când încercăm să citim dintr-un fişier text care nu există.

static void Main(string[] args)
{
  StreamReader fin;
  try
  {
    fin = new StreamReader("date.txt");
  }
  catch (FileNotFoundException)
  {
    Console.WriteLine("Fisierul nu exista!");
  }
}

Un ultim exemplu din această lecţie tratează situaţia în care se depăşesc limitele unui vector, adică încercăm să accesăm o componentă inexistentă.

int[] t = { 1, 6, 2, 8, 3, 6, 5 };
int i, s = 0;
try
{
  for (i = 0; i < 8; i++)
     s += t[i];
}
catch (IndexOutOfRangeException)
{
  Console.WriteLine("Acces la componente din afara tabloului!");
}
finally
{
  Console.WriteLine("Suma este : " + s);
}

La final, propun scrierea unor scurte secvenţe care tratează următoarele excepţii: DirectoryNotFoundException, DriveNotFoundException, FieldAccessException, InvalidCastException. Mai menţionez că termenul de "cast" se referă la conversie de la un tip de dată la altul.

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Comentarii (1)
  • Avatar

    MK 4-12-2011 4:0:15

    As dori o consultare cu dumneavoastra in legatura cu o problema legata de o iteratie.
    Daca aveti timp as dori sa va trimit un e-mail, doar sa-mi spuneti unde as putea gasi adresa dvs de e-mail?
    Va multumesc!

Scrie un comentariu
Nume:

Comentariu:

15 + 10 =