metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-09-29 11:55 am

С++ EH и логика на исключениях

Хорошо ли в C++ программе делать логику на исключениях?
Я ща втыкаю в одну опенсорсную СУБД в продакшене отладчиком и вижу что там на каждый запрос валится стопицот крестиковых исключений, и не понимаю, это нормально или нет.

[identity profile] cross-join.livejournal.com 2014-09-29 01:31 pm (UTC)(link)
С этого я начал ветку, если вы заметили.
Однако, накладные расходы на реализацию средой и компилятором исключений сильно преувеличены. На производительность влияет вложенность исключений и обработка в циклах.

[identity profile] maxdz.livejournal.com 2014-09-29 01:42 pm (UTC)(link)
>накладные расходы на реализацию средой и компилятором исключений сильно преувеличены

~ +10-20% роста размера кода и снижения быстродействия, в сравнении даже с C++ без исключений (не говоря уж о C), для средних приложений, с активным использованием исключений лишь для обработки ошибок.

А если пользоваться исключeниями для обычных нотификаций - за такое надо давать канделябром.

[identity profile] cross-join.livejournal.com 2014-09-29 01:54 pm (UTC)(link)
Перечисленное может быть важно только для определенных классов приложений, например, встроенных, где ресурсы могут быть существенно ограничены.
В других областях, прежде всего, бизнес-приложениях, механизм исключений - стандартный способ сообщений о любых внештатных ситуациях уровня прикладной разработки.
Это освобождает от явного описывания контрактов для всех функций в системе.
И, еще раз, проблему вызывают не сами исключения, а их вложеннная генерация и обработка в циклах.

[identity profile] maxdz.livejournal.com 2014-09-29 02:03 pm (UTC)(link)
"стандартный способ сообщений о любых внештатных ситуациях"

Именно так. Но автор описывает ситуацию, когда исключeния валятся без каких-либо внештатных ситуаций - просто, как нотификация пользователя (типа лога).

Исключения вызывают очень много проблем:
- для каждой функции, делающей throw, компилятор делает "обёртку" с информацией, нужной для правильного разворачивания стэка/вызова деструкторов для объектов на стэке
- функции со throw, как правило не могут вбыть соптимизированы (например, сделаны inline)
- c++ сложный язык и компилятор намного сложнее c-шного. Соответственно, c++ компиляторы реализованы для намного меньшего количества платформ, чем c, кроме того изобилируют ошибками, бывают ошибки и в кодогенерации, связанной с исключениями

В общем, исключения сами по себе, не cамый удачный инструмент при написании СУБД. А если уж кидать исключения, просто для информирования без каких-либо ошибок...
Edited 2014-09-29 14:07 (UTC)

[identity profile] cross-join.livejournal.com 2014-09-29 02:10 pm (UTC)(link)
Использовать исключения для штатных ситуаций невозможно по одной простой причине: они прерывают выполнение программы.
То что валится автору, скорее всего, исключения, посылаемые разными evalator выражений и значений, разработчики не предусмотрели обычных функций типа TryEvaluate c возвратом статуса.

[identity profile] vit-r.livejournal.com 2014-09-29 02:12 pm (UTC)(link)
Основная проблема исключений - они прячут логику управления программой.

[identity profile] maxdz.livejournal.com 2014-09-29 02:24 pm (UTC)(link)
Это проблема не исключений, а C++ :)