Это способ избежать дублирования кода (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
блок.
Самое простое, что нужно сделать, это просто позвонить после 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
,
Хотя ваш вопрос не является точной копией, ответ на этот вопрос является целесообразным.
То, что вы, похоже, просите, является эквивалентом finally
-clause в C ++, и ответ таков: в C ++ это обычно решается с помощью RAII.
Я не буду повторять довольно обширный ответ, который был дан в связанном вопросе SO, но в итоге вы убедитесь, что очистка ресурсов выполняется в деструкторе. Вполне вероятно, что ваш FinalAction()
это тот, который очищает ресурсы прямо сейчас.
Я не знаю, какие классы делают ProcessExceptionX а также FinalAction принадлежать или что ProcessException да, но, может быть, вы могли бы иметь только один ProcessException который получает параметры и выполняет FinalAction, например.:
...
try {
FinalAction();
}
catch (const Exception1& ex1) {
ProcessException(ex1);
}
...
void ProcessException (Exception e) {
// do things
FinalAction();
}