try-finally (Referenční dokumentace jazyka C#)
Pomocí bloku můžete vyčistit všechny prostředky, které jsou přiděleny v bloku try, a můžete spustit kód i v případě, že v bloku dojde finally k try výjimce. Obvykle se příkazy bloku finally spustí, když ovládací prvek opustí try příkaz . K přenosu řízení může dojít v důsledku normálního spuštění příkazu , , nebo šíření výjimky break continue z příkazu goto return try .
V rámci zpracované výjimky je finally zaručeno spuštění přidruženého bloku. Pokud je však výjimka neošetřena, provádění bloku závisí na způsobu aktivace finally operace unwind výjimky. To zase závisí na tom, jak je váš počítač nastavený. Jediné případy, finally kdy se klauzule nespouštějí, zahrnují okamžité zastavení programu. Příkladem toho může být vyvolání z důvodu poškození příkazů InvalidProgramException IL. Ve většině operačních systémů se při zastavení a uvolnění procesu bude přiměřeně vyčistit prostředky.
Obvykle není důležité, když neošetřená výjimka ukončí aplikaci bez ohledu na to, zda je blok finally spuštěn. Pokud však máte příkazy v bloku, které musí být spuštěny i v této situaci, jedním řešením je přidat finally catch blok do příkazu try - finally . Případně můžete zachytit výjimku, která může být vyvolána v bloku příkazu try try - finally výše v zásobníku volání. To znamená, že výjimku můžete zachytit v metodě , která volá metodu , která obsahuje příkaz , nebo v metodě, která volá tuto metodu, nebo v libovolné metodě v try - finally zásobníku volání. Pokud výjimka není zachycena, provádění bloku závisí na tom, zda se operační systém rozhodne aktivovat finally operaci unwind výjimky.
Příklad
V následujícím příkladu neplatný příkaz převodu způsobí System.InvalidCastException výjimku. Výjimka je neošetřená.
public class ThrowTestA
{
public static void Main()
{
int i = 123;
string s = "Some string";
object obj = s;
try
{
// Invalid conversion; obj contains a string, not a numeric type.
i = (int)obj;
// The following statement is not run.
Console.WriteLine("WriteLine at the end of the try block.");
}
finally
{
// To run the program in Visual Studio, type CTRL+F5. Then
// click Cancel in the error dialog.
Console.WriteLine("\nExecution of the finally block after an unhandled\n" +
"error depends on how the exception unwind operation is triggered.");
Console.WriteLine("i = {0}", i);
}
}
// Output:
// Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
//
// Execution of the finally block after an unhandled
// error depends on how the exception unwind operation is triggered.
// i = 123
}
V následujícím příkladu je výjimka z metody zachycena v TryCast metodě dále v zásobníku volání.
public class ThrowTestB
{
public static void Main()
{
try
{
// TryCast produces an unhandled exception.
TryCast();
}
catch (Exception ex)
{
// Catch the exception that is unhandled in TryCast.
Console.WriteLine
("Catching the {0} exception triggers the finally block.",
ex.GetType());
// Restore the original unhandled exception. You might not
// know what exception to expect, or how to handle it, so pass
// it on.
throw;
}
}
static void TryCast()
{
int i = 123;
string s = "Some string";
object obj = s;
try
{
// Invalid conversion; obj contains a string, not a numeric type.
i = (int)obj;
// The following statement is not run.
Console.WriteLine("WriteLine at the end of the try block.");
}
finally
{
// Report that the finally block is run, and show that the value of
// i has not been changed.
Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
}
}
// Output:
// In the finally block in TryCast, i = 123.
// Catching the System.InvalidCastException exception triggers the finally block.
// Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}
Další informace o najdete finally v tématu try-catch-finally.
Jazyk C# obsahuje také příkaz using, který poskytuje podobné funkce pro IDisposable objekty v praktické syntaxi.
specifikace jazyka C#
Další informace najdete v části s příkazem try specifikace jazyka C#.