Гарантируется ли, что ваш код достигнет finally
? Да (за исключением какого-то катастрофического события, такого как наступающий конец света ... или, как вы знаете, потеря вашего компьютера или сбой вашей ОС).
Но важно понимать, что если абсолютно необходимо, чтобы ваш код выполнялся, вам лучше убедиться, что ваш код не вызывает само исключение!
Возьмем, к примеру, это:
IDisposable someDisposableObject = null;
IDisposable someOtherDisposableObject = null;
try
{
someDisposableObject = GetDisposableObject();
throw new Exception("Holy crap, something bad happened.");
someOtherDisposableObject = GetOtherDisposableObject();
}
finally
{
// This will throw a NullReferenceException...
someOtherDisposableObject.Dispose();
// ...so this actually won't run.
someDisposableObject.Dispose();
}
Поэтому, если вы хотите, чтобы ваш весь finally
блок был запущен, важно написать его правильно, чтобы исключение (в идеале) было невозможным.