Мы видели много вопросов о том, когда и почему использовать try
/catch
и try
/catch
/finally
. И я знаю, что определенно используется прецедент для try
/finally
(тем более, что это так, как выполняется оператор using
).
Мы также видели вопросы о накладных расходах на try/catch и исключения.
Вопрос, который я связал, однако, не говорит о накладных расходах, когда JUST try-finally.
Предполагая, что нет исключений из всего, что происходит в блоке try
, что накладные расходы на выполнение операторов finally
выполняются при выходе из блока try
(иногда, возвращаясь из функции)?
Опять же, я спрашиваю ТОЛЬКО о try
/finally
, no catch
, не бросая исключений.
Спасибо!
РЕДАКТИРОВАТЬ: Хорошо, я попытаюсь немного улучшить свой вариант использования.
Что я должен использовать, DoWithTryFinally
или DoWithoutTryFinally
?
public bool DoWithTryFinally()
{
this.IsBusy = true;
try
{
if (DoLongCheckThatWillNotThrowException())
{
this.DebugLogSuccess();
return true;
}
else
{
this.ErrorLogFailure();
return false;
}
}
finally
{
this.IsBusy = false;
}
}
public bool DoWithoutTryFinally()
{
this.IsBusy = true;
if (DoLongCheckThatWillNotThrowException())
{
this.DebugLogSuccess();
this.IsBusy = false;
return true;
}
else
{
this.ErrorLogFailure();
this.IsBusy = false;
return false;
}
}
Этот случай слишком упрощен, потому что есть только две точки возврата, но представьте, если бы было четыре... или десять... или сто.
В какой-то момент я хотел бы использовать try
/finally
по следующим причинам:
- Сохраняйте принципы DRY (особенно по мере увеличения количества точек выхода)
- Если окажется, что я ошибаюсь в том, что моя внутренняя функция не выбрасывает исключение, то я хочу убедиться, что для параметра
this.Working
установлено значениеfalse
.
Итак, гипотетически, учитывая характеристики производительности, ремонтопригодность и СУХИЕ принципы,, для какого количества точек выхода (особенно если я может предположить, что все внутренние исключения пойманы) do Я хочу взять на себя любое ограничение производительности, связанное с try
/finally
?
EDIT # 2: Я изменил имя this.Working
на this.IsBusy
. Извините, забыл упомянуть, что это многопоточность (хотя только один поток действительно вызовет метод); другие потоки будут опроса, чтобы узнать, выполняет ли объект свою работу. Возвращаемое значение - это просто успех или неудача, если работа пошла так, как ожидалось.