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
finallynu rulează dacă procesul este oprit brusc (Environment.FailFast, oprire forțată,StackOverflowException).- Folosirea în
finallya unei variabile care poate fi încănull(resursa nu a apucat să fie creată). Verificănullsau foloseșteusing.
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.