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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Nov. 27th, 2025 07:49 pm
Powered by Dreamwidth Studios