C ++ начало и конец макроса функции - PullRequest
0 голосов
/ 07 августа 2010

Я пытаюсь написать два простых макроса для начала и конца функций, чтобы управлять и регистрировать все исключения в моей программе.Другими словами, я хочу иметь блок try-catch во всех моих функциях.

в простом случае рассмотрим следующие макросы.

#define __BEGIN_FUNCTION__ try {
#define __END_FUNCTION__ } catch(std::exception e) \
{ log << time << ':' << e << endl; }

, но если я положу эти два макроса в началои в конце функции компилятор выдаст ошибку «Не все пути управления возвращают значение».

какое-либо решение?

Ответы [ 3 ]

14 голосов
/ 07 августа 2010

Это ужасный способ обработки исключений.Если выдается исключение, это происходит из-за ошибки.Затем вам нужно либо обработать ошибку, решить возникшую проблему, либо позволить ей завершить программу.

Игнорирование исключение не имеет смысла.

По крайней мере, вы должны сбросить исключение, как только оно будет зарегистрировано.Измените макрос END_FUNCTION, чтобы включить throw;.Это также должно устранить ошибку компилятора, которую вы получаете.

Последнее замечание: ваши имена макросов выбраны неправильно.Имена, которые либо:

  • содержат двойное подчеркивание, либо
  • начинаются с подчеркивания, за которым следует заглавная буква

, зарезервированы для использования реализацией (компилятор и стандартная библиотека.

Вы рискуете конфликтовать, используя в своей программе такие имена, как везде .

Также следует учитывать, что перехват исключений должен выполняться по ссылке(catch (const std::exception& e), и что он не будет перехватывать исключения, не полученные из std::exception. Если вы хотите отлавливать все, что выброшено, используйте catch(...).

5 голосов
/ 07 августа 2010

Я знаю, что вы не хотите это слышать, но ответ состоит в том, чтобы включать блоки try / catch только тогда, когда они уместны.То, что вы пытаетесь сделать здесь, это в основном быть очень, очень ленивым, что дает практически нулевую выгоду.Это еще хуже, потому что вы воспринимаете все как общее исключение и не относитесь ни к одному из своих исключений так, как оно того заслуживает.

Ответ - «Не делай этого».

5 голосов
/ 07 августа 2010

Вместо этого, почему бы не позволить исключениям всплыть наверх и обработать их в одном месте?

Только перехватывать исключения, если вы можете что-то с этим сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...