try / finally în C# (.NET)

Blocul finally rulează mereu la ieșirea din try: după succes, după o excepție prinsă sau neprinsă și după return.

Sintaxă C#
try { ... } catch (Exception ex) { ... } finally { /* rulează mereu */ }

Ce face try / finally

Codul din finally se execută indiferent cum se iese din try: normal, prin return, break sau printr-o excepție. Este locul pentru curățenie: închiderea unei resurse, oprirea unui cronometru, revenirea la o stare anterioară.

catch este opțional: try/finally fără catch lasă excepția să urce mai departe, dar face curățenia înainte. Pentru obiectele IDisposable, using generează exact un astfel de bloc try/finally care apelează Dispose().

În finally nu poți scrie return. Dacă finally aruncă la rândul lui o excepție, aceasta o înlocuiește pe cea originală, așa că păstrează codul de acolo simplu.

Exemple

Exemplul 1: Ordinea de execuție

Console.WriteLine(Imparte(10, 2));
Console.WriteLine("---");
try
{
    Console.WriteLine(Imparte(10, 0));
}
catch (DivideByZeroException)
{
    Console.WriteLine("catch în apelant");
}

static int Imparte(int a, int b)
{
    try
    {
        Console.WriteLine("try");
        return a / b;
    }
    finally
    {
        Console.WriteLine("finally");
    }
}

Rezultat

try
finally
5
---
try
finally
catch în apelant

Exemplul 2: Revenire la o stare anterioară

Culoarea consolei este refăcută chiar dacă afișarea aruncă o excepție.

AfiseazaAvertisment("Stoc aproape epuizat");

static void AfiseazaAvertisment(string mesaj)
{
    ConsoleColor inainte = Console.ForegroundColor;
    try
    {
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine($"Atenție: {mesaj}");
    }
    finally
    {
        Console.ForegroundColor = inainte;
        Console.WriteLine("Culoarea a fost refăcută");
    }
}

Rezultat

Atenție: Stoc aproape epuizat
Culoarea a fost refăcută

Greșeli frecvente

  • finally nu rulează dacă procesul este oprit brusc (Environment.FailFast, oprire forțată, StackOverflowException).
  • Folosirea în finally a unei variabile care poate fi încă null (resursa nu a apucat să fie creată). Verifică null sau folosește using.

Comenzi înrudite

  • throw și throw expressions: Aruncă o excepție care oprește execuția normală; throw; simplu re-aruncă excepția prinsă, păstrând locul unde a apărut.
  • Excepții personalizate: O clasă proprie derivată din Exception descrie o eroare din domeniul aplicației și poate transporta date suplimentare.