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

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

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

[identity profile] bydlorus.livejournal.com 2014-09-29 11:44 am (UTC)(link)
А почему люди не летают, как птицы?

[identity profile] ext_1684112 (from livejournal.com) 2014-09-29 11:53 am (UTC)(link)
Я серьезно спрашиваю, мне неизвестны детали реализации исключений в c++. Может, язык не поддерживает, или поддерживает срого под одним компилятором, а надо два. Если же поддерживает, то что сложного, завести себе оное исключение и использовать?

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

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

[identity profile] vit-r.livejournal.com 2014-09-29 11:58 am (UTC)(link)
Люди явно учились по Яве.

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

[personal profile] alll 2014-09-29 12:07 pm (UTC)(link)
Спасибо, кэп. А С++ != С
develop7: (dero)

[personal profile] develop7 2014-09-29 12:07 pm (UTC)(link)
хуясе let it fail на сегфолтах

[identity profile] bydlorus.livejournal.com 2014-09-29 12:10 pm (UTC)(link)
Завести класс в С++ это примерно как комментить в жж с капчей. Ну его.

[identity profile] falcrum.livejournal.com 2014-09-29 12:18 pm (UTC)(link)
А на что там исключения валятся, если всё штатно?

[identity profile] naartir.livejournal.com 2014-09-29 12:53 pm (UTC)(link)
Смелые люди не боятся UB?
Edited 2014-09-29 12:56 (UTC)

[identity profile] bydlorus.livejournal.com 2014-09-29 12:56 pm (UTC)(link)
Какой ещё UB? Там всегда приходит NullReferenceException!

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

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

[identity profile] naartir.livejournal.com 2014-09-29 01:15 pm (UTC)(link)
Обычный UB. Разыменование нулевого указателя. Можно погуглить стандрат, если интересно. У меня, кстати, в таком случае с сегфолтом падает (gcc на GNU/Linux). А "Какой ещё UB? Там всегда приходит NullReferenceException!" и означает, что смелые виндоус-программеры UB не боятся. )

[identity profile] berezovsky.livejournal.com 2014-09-29 01:17 pm (UTC)(link)
вроде же с 0x0...05 access denied должно падать

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

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

[identity profile] bydlorus.livejournal.com 2014-09-29 01:17 pm (UTC)(link)
Я ещё раз спрашиваю - какой-такой UB, если программист проверил - он тыкает мышкой в объект без прав, и приходит NullReferenceException. Причём он два раза тыкнул, а может и три - всегда одно и то же исключение. И где здесь UB? Всё же вполне defined.

[identity profile] naartir.livejournal.com 2014-09-29 01:18 pm (UTC)(link)
Вы троллите или действительно не знаете, что такое UB?

[identity profile] bydlorus.livejournal.com 2014-09-29 01:20 pm (UTC)(link)
Ну можно сказать, что и троллю. А можно сказать, я намекаю, что windows программисты не знают, что такое UB. Да и зачем им это знать, если они тыкают мышкой, и приходит nullref, при чём тут вообще UB?

[identity profile] naartir.livejournal.com 2014-09-29 01:22 pm (UTC)(link)
А, ну ОК ) Я, собственно, про то же.

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

[identity profile] ext_1684112 (from livejournal.com) 2014-09-29 01:48 pm (UTC)(link)
С явы ни один человек по доброй воле на С++ не перелезет.

И вдобавок, в яве исключение тоже является дорогой операцией.

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

Page 2 of 4