Обновление : На самом деле это не очень хороший ответ. С другой стороны, может быть, - это хороший ответ, потому что он иллюстрирует прекрасный пример успеха finally
, когда разработчик (то есть я) может не обеспечить надлежащую очистку. В приведенном ниже коде рассмотрим сценарий, в котором выдается исключение , отличное от , чем SpecificException
. Тогда первый пример все равно будет выполнять очистку, а второй - нет, даже если разработчик может думать"Я поймал исключение и обработал его, поэтому, несомненно, будет выполняться следующий код."
Каждый дает основания использовать try
/ finally
без a catch
. Тем не менее, имеет смысл сделать это с a catch
, даже если вы вызываете исключение. Рассмотрим случай *, когда вы хотите вернуть значение.
try
{
DoSomethingTricky();
return true;
}
catch (SpecificException ex)
{
LogException(ex);
return false;
}
finally
{
DoImportantCleanup();
}
Альтернатива вышеприведенному без a finally
(на мой взгляд) несколько менее читабельна:
bool success;
try
{
DoSomethingTricky();
success = true;
}
catch (SpecificException ex)
{
LogException(ex);
success = false;
}
DoImportantCleanup();
return success;
* Я думаю, лучше пример try
/ catch
/ finally
- это когда исключение вызывается повторно (использование throw
, не throw ex
- но это уже другая тема) в блоке catch
, поэтому необходим finally
, так как без него код после try
/ catch
не будет работать. Обычно это выполняется с помощью оператора using
для ресурса IDisposable
, но это не всегда так. Иногда очистка - это не просто вызов Dispose
(или больше, чем просто вызов Dispose
).