Проделайте то же действие в конце блока try, и все часы перехвата в инструкции try-catch

Это способ избежать дублирования кода (FinalAction вызов функции во всех catch блоки и в try один)?

try
{
// some actions including creation of new objects
FinalAction();
}
catch (const Exception1& ex1)
{
ProcessException1(ex1);
FinalAction();
}
catch (const Exception2& ex2)
{
ProcessException2(ex2);
FinalAction();
}
// ...
catch (const ExceptionN& exN)
{
ProcessExceptionN(exN);
FinalAction();
}
catch (...)
{
ProcessUnknownException();
FinalAction();
}

Обновить: FinalAction() должен быть назван до деструкторы объектов, созданных в try блок. Такое простое решение, как следующее, здесь не работает.

try
{
// some actions including creation of new objects
}
catch (const Exception1& ex1)
{
ProcessException1(ex1);
}
catch (const Exception2& ex2)
{
ProcessException2(ex2);
}
// ...
catch (const ExceptionN& exN)
{
ProcessExceptionN(exN);
}
catch (...)
{
ProcessUnknownException();
}
FinalAction();

Еще немного информации о FinalAction: он не выбрасывает и не очищает ресурсы, выделенные в try блок.

-2

Решение

Самое простое, что нужно сделать, это просто позвонить после try блок.

bool success = false;
try
{
// some actions including creation of new objects
FinalAction();
success = true;
}
catch (const Exception1& ex1)
{
ProcessException1(ex1);
}
if (!success)
FinalAction();

Однако довольно сомнительно делать это, а не использовать класс для управления любым ресурсом, который вы чистите. FinalAction,

-2

Другие решения

Хотя ваш вопрос не является точной копией, ответ на этот вопрос является целесообразным.

То, что вы, похоже, просите, является эквивалентом finally-clause в C ++, и ответ таков: в C ++ это обычно решается с помощью RAII.

Я не буду повторять довольно обширный ответ, который был дан в связанном вопросе SO, но в итоге вы убедитесь, что очистка ресурсов выполняется в деструкторе. Вполне вероятно, что ваш FinalAction() это тот, который очищает ресурсы прямо сейчас.

1

Я не знаю, какие классы делают ProcessExceptionX а также FinalAction принадлежать или что ProcessException да, но, может быть, вы могли бы иметь только один ProcessException который получает параметры и выполняет FinalAction, например.:

...
try {
FinalAction();
}
catch (const Exception1& ex1) {
ProcessException(ex1);
}
...

void ProcessException (Exception e) {
// do things
FinalAction();
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector