С++ EH и логика на исключениях
Хорошо ли в C++ программе делать логику на исключениях?
Я ща втыкаю в одну опенсорсную СУБД в продакшене отладчиком и вижу что там на каждый запрос валится стопицот крестиковых исключений, и не понимаю, это нормально или нет.
Я ща втыкаю в одну опенсорсную СУБД в продакшене отладчиком и вижу что там на каждый запрос валится стопицот крестиковых исключений, и не понимаю, это нормально или нет.
no subject
Для ООП в целом - стандартный подход, исключение - это способ послать сообщение.
Отсюда вывод, для написания СУБД надо уметь оба подхода.
no subject
Сообщения - это сообщения.
no subject
no subject
Потому и использовать их (если использовать вообще), рекомендуется лишь в исключительных ситуациях. Отсюда и их название, собственно.
no subject
Однако, накладные расходы на реализацию средой и компилятором исключений сильно преувеличены. На производительность влияет вложенность исключений и обработка в циклах.
no subject
~ +10-20% роста размера кода и снижения быстродействия, в сравнении даже с C++ без исключений (не говоря уж о C), для средних приложений, с активным использованием исключений лишь для обработки ошибок.
А если пользоваться исключeниями для обычных нотификаций - за такое надо давать канделябром.
no subject
В других областях, прежде всего, бизнес-приложениях, механизм исключений - стандартный способ сообщений о любых внештатных ситуациях уровня прикладной разработки.
Это освобождает от явного описывания контрактов для всех функций в системе.
И, еще раз, проблему вызывают не сами исключения, а их вложеннная генерация и обработка в циклах.
no subject
Именно так. Но автор описывает ситуацию, когда исключeния валятся без каких-либо внештатных ситуаций - просто, как нотификация пользователя (типа лога).
Исключения вызывают очень много проблем:
- для каждой функции, делающей throw, компилятор делает "обёртку" с информацией, нужной для правильного разворачивания стэка/вызова деструкторов для объектов на стэке
- функции со throw, как правило не могут вбыть соптимизированы (например, сделаны inline)
- c++ сложный язык и компилятор намного сложнее c-шного. Соответственно, c++ компиляторы реализованы для намного меньшего количества платформ, чем c, кроме того изобилируют ошибками, бывают ошибки и в кодогенерации, связанной с исключениями
В общем, исключения сами по себе, не cамый удачный инструмент при написании СУБД. А если уж кидать исключения, просто для информирования без каких-либо ошибок...
no subject
То что валится автору, скорее всего, исключения, посылаемые разными evalator выражений и значений, разработчики не предусмотрели обычных функций типа TryEvaluate c возвратом статуса.
no subject
no subject
no subject
Исключение - это исключение. Отказ ресурса или ошибочные данные - это штатная ситуация в программе.
no subject
Да и незачем перекладывать это на программиста без особых причин.
В процедурном стиле для возвратов используются структуры (записи), а не объекты.
no subject
no subject