Я думаю, что вам не хватает того, что может catch (...)
сделать.
Вы говорите в своем примере "увы, не можете изучить исключение". Ну, у вас нет информации о типе исключения. Вы даже не знаете, является ли это полиморфным типом, поэтому даже если бы у вас была какая-то нетипизированная ссылка на него, вы даже не могли бы безопасно попробовать dynamic_cast
.
Если вы знаете об определенных исключениях или иерархиях исключений, с которыми можно что-то делать, то это место для блоков перехвата с расширенными именами типов.
catch (...)
не часто используется в C ++. Он может использоваться в местах, которые должны гарантировать, что они не бросают или только выбрасывают определенные контрактные исключения. Если вы используете catch (...)
для очистки, то очень велика вероятность того, что ваш код не является надежно исключительным в любом случае.
Как уже упоминалось в других ответах, если вы используете локальные объекты для управления ресурсами (RAII), то это может удивить и пролить свет на то, как мало блоков catch вам нужно, часто - если вам не нужно ничего делать локально, за исключением - даже блок try может быть избыточным, поскольку вы позволяете исключениям перетекать в клиентский код, который может реагировать на них, при этом гарантируя отсутствие проблем с ресурсами.
Чтобы ответить на ваш исходный вопрос, если вам нужен какой-то фрагмент кода для выполнения в конце блока, исключение или отсутствие исключения, тогда рецепт будет.
class LocalFinallyReplacement {
~LocalFinallyReplacement() { /* Finally code goes here */ }
};
// ...
{ // some function...
LocalFinallyReplacement lfr; // must be a named object
// do something
}
Обратите внимание, как мы можем полностью покончить с try
, catch
и throw
.
Если у вас есть данные в функции, которые были первоначально объявлены вне блока try, к которым вам нужен доступ в блоке "finally", то вам может потребоваться добавить их в конструктор вспомогательного класса и сохранять их до деструктора. , Однако на этом этапе я бы серьезно пересмотрел вопрос о том, можно ли решить проблему, изменив дизайн локальных объектов обработки ресурсов, поскольку это может привести к ошибкам в дизайне.