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

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

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

[identity profile] cross-join.livejournal.com 2014-09-29 09:45 am (UTC)(link)
Для систем класса СУБД ненормально, лишние затраты, время и т.д.
Для ООП в целом - стандартный подход, исключение - это способ послать сообщение.
Отсюда вывод, для написания СУБД надо уметь оба подхода.

[identity profile] vit-r.livejournal.com 2014-09-29 11:57 am (UTC)(link)
"Старнартный подход" - это потому, что "у нас в коллективе такие идиоты, что проверить возвращаемое значение функции не могут"

Сообщения - это сообщения.

[identity profile] cross-join.livejournal.com 2014-09-29 12:03 pm (UTC)(link)
Исключение тоже возвращает значение, только в виде объекта.

[identity profile] maxdz.livejournal.com 2014-09-29 01:01 pm (UTC)(link)
Исключение делает (и добавляет в код) намного больше, чем просто отсылка сообщения.

Потому и использовать их (если использовать вообще), рекомендуется лишь в исключительных ситуациях. Отсюда и их название, собственно.

[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++ :)

[identity profile] vit-r.livejournal.com 2014-09-29 01:17 pm (UTC)(link)
Ничего не мешает из функции вернуть объект.

Исключение - это исключение. Отказ ресурса или ошибочные данные - это штатная ситуация в программе.

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

[identity profile] vit-r.livejournal.com 2014-09-29 01:44 pm (UTC)(link)
Работа с памятью - это на порядок более простая проблема, чем алгоритмы и правильная обработка.

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