Мы видели много вопросов о том, когда и почему использовать 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. Извините, забыл упомянуть, что это многопоточность (хотя только один поток действительно вызовет метод); другие потоки будут опроса, чтобы узнать, выполняет ли объект свою работу. Возвращаемое значение - это просто успех или неудача, если работа пошла так, как ожидалось.