Para preguntas como estas, generalmente abro un proyecto de aplicación de consola vacía en Visual Studio y escribo un pequeño programa de muestra:
using System;
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("exception thrown from try block");
}
catch (Exception ex)
{
Console.WriteLine("Inner catch block handling {0}.", ex.Message);
throw;
}
finally
{
Console.WriteLine("Inner finally block");
throw new Exception("exception thrown from finally block");
Console.WriteLine("This line is never reached");
}
}
catch (Exception ex)
{
Console.WriteLine("Outer catch block handling {0}.", ex.Message);
}
finally
{
Console.WriteLine("Outer finally block");
}
}
}
Cuando se ejecuta el programa, verá el orden exacto en el que catch
y finally
bloques son ejecutados. Tenga en cuenta que el código en el bloque finalmente después de que se lanza la excepción no se ejecutará (de hecho, en este programa de ejemplo, Visual Studio incluso le advertirá que ha detectado código inalcanzable):
Excepción de manejo de bloque de captura interna lanzada desde el bloque try.
Finalmente bloque interior
Excepción de manejo de bloque de captura externa lanzada desde finalmente bloque.
Exterior finalmente bloquear
Observación adicional
Como señaló Michael Damatov, try
se "comerá" una excepción del bloque si no lo maneja en un catch
bloque (interno) . De hecho, en el ejemplo anterior, la excepción relanzada no aparece en el bloque de captura externo. Para aclarar aún más la siguiente muestra ligeramente modificada:
using System;
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("exception thrown from try block");
}
finally
{
Console.WriteLine("Inner finally block");
throw new Exception("exception thrown from finally block");
Console.WriteLine("This line is never reached");
}
}
catch (Exception ex)
{
Console.WriteLine("Outer catch block handling {0}.", ex.Message);
}
finally
{
Console.WriteLine("Outer finally block");
}
}
}
Como puede ver en la salida, la excepción interna se "pierde" (es decir, se ignora):
Finalmente bloque interior
Excepción de manejo de bloque de captura externa lanzada desde finalmente bloque.
Exterior finalmente bloquear