Para perguntas como essas, geralmente abro um projeto de aplicativo de console vazio no Visual Studio e escrevo um pequeno programa de exemplo:
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");
}
}
}
Quando você executa o programa, verá a ordem exata na qual os blocos catch
e finally
são executados. Observe que o código no bloco final após o lançamento da exceção não será executado (de fato, neste programa de exemplo, o Visual Studio até avisará que ele detectou código inacessível):
Exceção de manipulação do bloco de captura interno lançada do bloco try.
Bloco finalmente interno
Exceção de manipulação do bloco de captura externa lançada do bloco finalmente.
Bloco externo finalmente
Observação adicional
Como Michael Damatov apontou, uma exceção do try
bloco será "comida" se você não lidar com isso em um catch
bloco (interno) . De fato, no exemplo acima, a exceção lançada novamente não aparece no bloco de captura externo. Para tornar isso ainda mais claro, observe a seguinte amostra ligeiramente 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 você pode ver na saída, a exceção interna é "perdida" (ou seja, ignorada):
Bloco finalmente interno
Exceção de manipulação do bloco de captura externa lançada do bloco finalmente.
Bloco externo finalmente