Предполагая, что процесс не завершается внезапно (или, конечно, зависает), блок finally всегда будет выполняться.
Если блока finally нет, исключение из блока catch будет просто выброшено в стек. Обратите внимание, что исходное исключение, которое вызвало выполнение блока catch, будет эффективно потеряно.
Исключения переполнения стека
Как отметил Джаред, переполнение стека приведет к тому, что блок finally не будет выполнен. Я считаю, что это внезапно завершает программу, но я могу ошибаться. Вот пример кода:
using System;
public class Test
{
static void Main()
{
// Give the stack something to munch on
int x = 10;
try
{
Main();
Console.WriteLine(x);
}
finally
{
Console.WriteLine("Finally");
}
}
}
Результаты:
Процесс завершен из-за StackOverflowException.