Если если надо прыгать на точку выхода из функции, с очисткой, то лучше всего goto.
Метка всего одна, не запутаешься:
Resource* res1 = NULL;
Resource* res2 = NULL;
hr = Foo1();
if (FAILED(hr)) goto CLEANUP;
res1 = ...;
hr = Bar2();
if (FAILED(hr)) goto CLEANUP;
res2 = ...;
CLEANUP:
if (res1)
FreeResource(res1);
if (res2)
FreeResource(res2);
Проверку можно макросом сделать, чтобы код не засорять проверочной логикой.
В Мозилловском коде так сделано, там макрос NS_ENSURE(..), как-то так, правда, они по нему сразу из функции выходят, у них все почти ресурсы автоматически удаляются в деструкторах.
Ещё читал, что так же (goto CLEANUP) в линуксовском ядре сделано.
Это удобно очень, код не засоряет тривиальной проверочной логикой и левыми циклами, а поскольку метка всего одна, ничего страшного в goto нет.
Правда, не уверен, вызываются ли деструкторы локальных объектов, если прыгаем из вложенного блока в конец внешнего.
А вариант с циклом не подойдёт, если уже есть внешний цикл — break не метку, как в C#, в C++ вроде нет.
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, kirill_kl, Вы писали:
_>>А почему использование исключений нежелательно?
Doc>1) Программа небольшая. Везде уже сделана струкрутрная обработка ошибок. Doc>Ради одной функции затевать обработку на эксепшенах — нет смысла.
Doc>2) Не люблю накладных расходы (даже если они копеечные), которых можно избежать.
Здравствуйте, Константин Л., Вы писали:
КЛ>они нанокопеечные
Спорить не буду (в смысле нет такой цели). Но если все уже сделано структурно, то пихать эксшепшн еще и не красиво. IMHO идеология должна быть едина в программе (особенно если она среднего или малого размера и пишется небольшой командой или вообще одним человеком).
L>>В случае FAILED делай return (это можно обернуть в макрос). L>>Очистку ресурсов делай в деструкторах.
Doc>Это заставит разбивать каждую функцию на несколько мелких. Иначе как при return выводить сообщения.
Через деструктор обьекта, создаваемый на стеке. В принципе, тоже можно завернуть в макрос.
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, Константин Л., Вы писали:
КЛ>>они нанокопеечные
Doc>Спорить не буду (в смысле нет такой цели). Но если все уже сделано структурно, то пихать эксшепшн еще и не красиво. IMHO идеология должна быть едина в программе (особенно если она среднего или малого размера и пишется небольшой командой или вообще одним человеком).
если проект имеет свойство расширяться, то добавление обработки исключений будет дальновидным решением.