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

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

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

[identity profile] cross-join.livejournal.com 2014-09-29 01:56 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] vit-r.livejournal.com 2014-09-29 02:10 pm (UTC)(link)
В Яве исключение является не исключением, а образом жизни.

[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:13 pm (UTC)(link)
>С явы ни один человек по доброй воле на С++ не перелезет.

Ява-программа 1) тормозит 2) жрёт память + ява-язык отбирает контроль у разработчика. Потому, гуру переходят с удовольствием. :)
Edited 2014-09-29 14:16 (UTC)

[identity profile] ext_1684112 (from livejournal.com) 2014-09-29 02:19 pm (UTC)(link)
Это все сказки Венского леса.

Да, у явы есть неубираемый оверхед. Но в большинстве случаев, системы, написанные на Яве, были бы вообще не завершены, если делать на С++.

Мой знакомый гуру как раз перешел с С++ на яву, сейчас в яндексе работает.

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

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

[identity profile] maxdz.livejournal.com 2014-09-29 02:28 pm (UTC)(link)
>системы, написанные на Яве, были бы вообще не завершены, если делать на С++

Всё, что можно написать на Джава, уже было написано на C++ до неё.
Более того, есть масса вещей типа операционыне системы, броузеры, встраиваемый софт, игрушки, всякие специализированные приблуды в обработке изображений/сигналов, движки СУБД, итп - которые уже на писаны на C++ (а часто и на C), а на Джава не будут написаны ещё очень и очень долго. Если вообще...

[identity profile] volodymir-k.livejournal.com 2014-09-29 05:38 pm (UTC)(link)
В учебниках Явы ещё с 2003 года всегда писали, что так делать нельзя. Хорошо известная ошибка новичков.

[identity profile] nivanych.livejournal.com 2014-09-29 06:12 pm (UTC)(link)
Агда же!

[identity profile] ynot.livejournal.com 2014-09-29 08:22 pm (UTC)(link)
"системы, написанные на Яве, были бы вообще не завершены, если делать на С++"

вы так говорите, как будто это плохо!

[identity profile] worm-ii.livejournal.com 2014-09-30 06:56 am (UTC)(link)
Поскольку "Access Violation" переводится как "Нарушение прав доступа", то тут даже ловить и преобразовывать исключение не надо :-)

[identity profile] bydlorus.livejournal.com 2014-09-30 06:59 am (UTC)(link)
Чёрт, у меня открылись глаза. Это гораздо более простое объяснение того, почему вин программисты использовали это исключение...

[identity profile] potan.livejournal.com 2014-09-30 01:33 pm (UTC)(link)
Нет, исключения там только в IO-монаде.

[identity profile] potan.livejournal.com 2014-09-30 01:35 pm (UTC)(link)
В OCaml так любят делать. Там исключения очень эффективно реализованы.
В MzScheme(Racket) в стандартной библиотеке ошибки бросают исключения, хоть они и тормозят.

[identity profile] ivanzoid.livejournal.com 2014-10-01 05:55 pm (UTC)(link)
ГРЕШНОВАТО

[personal profile] leotsarev 2014-10-02 11:41 am (UTC)(link)
Ребе, простите, что к вам обращаемся.
Необходимо срочно (вчера) найти телефон родственника в Белорусии по адресу и фамилии.
В интернетах пишут вроде:
Одно дело с ныне проживающими жителями Беларуси, т.е. найти родственников по фамилии – это можно сделать по справочникам в Библиотеке либо по общереспубликанскому телефону справочной службы (Справочная служба о номерах телефонов квартир и организаций - № тел. 109, Мингорсправка - № тел. 168, международный код г.Минска +375 17). Однако даже в этом случае, чтобы дойти до нужного адресата, Вам понадобится хотя бы ФИО, либо адрес, либо телефон. Но это самая простая ситуация, и если человек долго проживает и прописан в Беларуси, то отыскать его не должно составить труда.

Но на короткие белорусские номера из богоспасаемой не позвонить. Есть советы, куда бежать?

[identity profile] metaclass.livejournal.com 2014-10-02 12:08 pm (UTC)(link)
Точно не знаю, не пользовался.
Если Минск, то могу глянуть по старой телефонной базе, в личку фамилию и адрес скиньте.

[personal profile] leotsarev 2014-10-02 12:08 pm (UTC)(link)
Могилёв.

[identity profile] metaclass.livejournal.com 2014-10-02 12:16 pm (UTC)(link)
А, тогда не знаю.

[personal profile] leotsarev 2014-10-02 12:22 pm (UTC)(link)
Усе, нагуглил. Оказывается есть справочники общедоступные прямо в интернетах.

[identity profile] permea-kra.livejournal.com 2014-10-07 07:56 am (UTC)(link)
>Нет, исключения там только в IO-монаде.

Это неправда, исключения там есть еще в Either(T) & Maybe(T), плюс при желании можно бросить исключение даже в чистом коде через fail :: String -> a или неполный паттерн-матчинг. Другое дело, что это порицается.

[identity profile] potan.livejournal.com 2014-10-07 08:00 am (UTC)(link)
Either и Maybe - это скорее аналоги null и кодов ошибок, а совсем не исключения.
fail - это монада. Неполный паттерн-матчинг, как и деление на ноль, конечно способ бросить исключение в чистом коде, но перехватить его можно только в монаде IO.

Page 3 of 4