Есть ли какое-нибудь применение для C ++ броска украшения? - PullRequest
14 голосов
/ 11 сентября 2009

Я начал использовать исключения C ++ единообразным образом, и теперь я хотел бы, чтобы компилятор (g ++) проверил, что нет «утечек исключений». Декорация throw должна сделать это, как const для константности методов класса.

Ну, это не так.

Использование throw все еще документально, но может даже вводить в заблуждение, если другие считают, что функция не может генерировать другие исключения, кроме тех, которые перечислены в ее документации.

Можно ли как-то убедить g ++ быть более строгим в своей проверке броска, то есть действительно убедиться, что функция, оформленная как throw(), никогда ничего не выкинет.

Edit: Нашел этот вопрос широко разбирается в теме.

Ответы [ 4 ]

17 голосов
/ 11 сентября 2009

Он не проверяет время компиляции, но соответствующий компилятор должен обеспечить его во время выполнения.

Если функция выбрасывает что-либо вне своего броска-объявления, среда выполнения C ++ должна вызвать std :: непредвиденный, если я правильно помню.

8 голосов
/ 11 сентября 2009

Я также рекомендовал бы посмотреть это эссе о спецификациях исключений. Он указывает на проблемы этой функции C ++, такие как:

  • Это система теневого типа
  • Компилятор проверяет выброшенные исключения только во время выполнения
  • Инициируемое поведение по умолчанию в случае сгенерированного, но не указанного исключения, как правило, невозможно использовать и часто неправильно понимается программистами
2 голосов
/ 11 сентября 2009

В основном, спецификации исключений хороши только как пустые спецификации исключений. В противном случае я думаю, что это эксперимент, который не удался. Смотрите ответ Флипси почему.

0 голосов
/ 11 сентября 2009

Я не знаю, может ли чекер / компилятор сделать это. Возможно, это проще комментировать в объявлении функции. Что ж, это не доказательство глупости, но если люди увидят, что может быть выдано исключение, то большинство людей обернут вызов функции в try и catch.

//Can throw Exception
GetFoo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...