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

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

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

[identity profile] trueblacker.livejournal.com 2014-09-29 09:02 am (UTC)(link)
нехорошо

[identity profile] http://users.livejournal.com/_slw/ 2014-09-29 09:03 am (UTC)(link)
но нормально (и так у них всё!)

[identity profile] tiendil.livejournal.com 2014-09-29 09:04 am (UTC)(link)
Нормальность скорее определяется уместностью конкретных случаев использования исключений, чем языком.

[identity profile] aamonster.livejournal.com 2014-09-29 09:05 am (UTC)(link)
По мне - очень не айс. Как минимум, неудобно отлаживаться.
Лучше их оставлять для по настоящему тяжёлых случаев.

Да и зубры то же самое рекомендуют...

[identity profile] bydlorus.livejournal.com 2014-09-29 09:06 am (UTC)(link)
Для вин-программистов это норма. Некоторые делают логику на разыменовании неинициализированного указателя. Например, если у юзера нет прав, объект не создаётся, происходит обращение по адресу NULL, возникает Access Violation, SEH преобразует это в C++ исключение, оно ловится и обрабатывается как "нет прав доступа", на это дело даже интеграционный тест написан.

Поэтому мы под линукс эмулируем этот seh (через сигналы и дизассемблирование инструкций по адресу в стеке), так, чтобы тест отрабатывал.

[identity profile] aamonster.livejournal.com 2014-09-29 09:20 am (UTC)(link)
Страшные вещи вы рассказываете... Первая мысль "а вот у нас на маке можно вызывать методы у нулевого указателя!", вторая "блин, я ж писал на винде - никто так не делал, на ноль проверяли явно, и это задалбывало"

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 09:26 (UTC) - Expand

(no subject)

[identity profile] aamonster.livejournal.com - 2014-09-29 09:45 (UTC) - Expand

[identity profile] vp.livejournal.com 2014-09-29 10:16 am (UTC)(link)
Нифига ж себе.

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 10:20 (UTC) - Expand

[identity profile] ext_1684112 (from livejournal.com) 2014-09-29 11:41 am (UTC)(link)
А почему нельзя просто выбросить специализированное исключение?

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 11:44 (UTC) - Expand

(no subject)

[identity profile] ext_1684112 - 2014-09-29 11:53 (UTC) - Expand

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 12:10 (UTC) - Expand
develop7: (dero)

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

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

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 12:56 (UTC) - Expand

(no subject)

[identity profile] naartir.livejournal.com - 2014-09-29 13:15 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2014-09-29 13:17 (UTC) - Expand

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 13:17 (UTC) - Expand

(no subject)

[identity profile] naartir.livejournal.com - 2014-09-29 13:18 (UTC) - Expand

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-29 13:20 (UTC) - Expand

(no subject)

[identity profile] naartir.livejournal.com - 2014-09-29 13:22 (UTC) - Expand

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

(no subject)

[identity profile] bydlorus.livejournal.com - 2014-09-30 06:59 (UTC) - Expand

[personal profile] alll 2014-09-29 09:44 am (UTC)(link)
Смотря чего логику. Если логику обработки нештатных ситуаций, то скорее хорошо. Если бизнес-логику, то скорее нехорошо.

[identity profile] metaclass.livejournal.com 2014-09-29 10:31 am (UTC)(link)
Запросы отрабатывают корректно, вроде нештатной ситуации не наблюдается.

(no subject)

[personal profile] alll - 2014-09-29 10:56 (UTC) - Expand

(no subject)

[identity profile] falcrum.livejournal.com - 2014-09-29 12:18 (UTC) - Expand

(no subject)

[identity profile] vaddimka.livejournal.com - 2014-09-29 14:26 (UTC) - Expand

[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)
"Старнартный подход" - это потому, что "у нас в коллективе такие идиоты, что проверить возвращаемое значение функции не могут"

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

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 12:03 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 13:01 (UTC) - Expand

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 13:31 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 13:42 (UTC) - Expand

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 13:54 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 14:03 (UTC) - Expand

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 14:10 (UTC) - Expand

(no subject)

[identity profile] vit-r.livejournal.com - 2014-09-29 14:12 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 14:24 (UTC) - Expand

(no subject)

[identity profile] vit-r.livejournal.com - 2014-09-29 13:17 (UTC) - Expand

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 13:27 (UTC) - Expand

(no subject)

[identity profile] vit-r.livejournal.com - 2014-09-29 13:44 (UTC) - Expand

(no subject)

[identity profile] cross-join.livejournal.com - 2014-09-29 13:56 (UTC) - Expand

[identity profile] dr-cha0s.livejournal.com 2014-09-29 09:49 am (UTC)(link)
Это считается грехом. Однако, в корбе иногда нет иной возможности, кроме как бросать эксепшены типа NotFoundError.

[identity profile] sbj-ss.livejournal.com 2014-09-29 10:15 am (UTC)(link)
Ребе, вон NTFS на SEH работает - и ничего… %)

[identity profile] justy-tylor.livejournal.com 2014-09-29 10:17 am (UTC)(link)
Смотря для чего.

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

Если _можно_ и _удобно_ представить рассматриваемую ситуацию в виде задачи и требований, то исключения годный инструмент. Иначе - ошибка проектирования.

[identity profile] maxdz.livejournal.com 2014-09-29 10:36 am (UTC)(link)
>Хорошо ли в C++ программе делать логику на исключениях?

Нехорошо.

Да и вообще, опен-соурсные субд лучше бы писать на C (без плюсов).

[personal profile] alll 2014-09-29 10:59 am (UTC)(link)
Переформулируя вопрос в терминах лучше-бы-С: хорошо ли в программе делать логику на лонгджампах? :)

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 11:06 (UTC) - Expand

(no subject)

[personal profile] alll - 2014-09-29 12:07 (UTC) - Expand

[identity profile] psilogic.livejournal.com 2014-09-29 11:10 am (UTC)(link)
Выброс исключения (throw) - штука сравнительно медленная, поэтому для штатной работы однозначно нехорошо. Опять же, отлаживать в Visual Studio неудобно: теряет смысл брекпоинт на исключение заданного типа, а Output-окно засирается ненужной инфой.

А вот для обработки ошибок, напротив, штука полезная - сильно сокращает объем текста, делает его обозримым, позволяет брякать на определенную ошибку без потери времени на пошаговую (правда вынуждает дополнительно заморачиваться с прикапыванием всего аллоцированного в объектах с деструкторами, но даже и это в конечном счете окупается)

[identity profile] veter-r-r.livejournal.com 2014-09-29 11:19 am (UTC)(link)
А есть языки, в которых логику на исключениях делать хорошо?

(no subject)

[identity profile] veter-r-r.livejournal.com - 2014-09-29 11:38 (UTC) - Expand

(no subject)

[identity profile] nivanych.livejournal.com - 2014-09-29 18:12 (UTC) - Expand

(no subject)

[identity profile] potan.livejournal.com - 2014-09-30 13:33 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2014-10-07 07:56 (UTC) - Expand

(no subject)

[identity profile] potan.livejournal.com - 2014-10-07 08:00 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2014-10-08 10:31 (UTC) - Expand

(no subject)

[identity profile] potan.livejournal.com - 2014-09-30 13:35 (UTC) - Expand

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

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

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

(no subject)

[identity profile] vit-r.livejournal.com - 2014-09-29 14:10 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 14:13 (UTC) - Expand

(no subject)

[identity profile] ext_1684112 - 2014-09-29 14:19 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2014-09-29 14:28 (UTC) - Expand

(no subject)

[identity profile] ynot.livejournal.com - 2014-09-29 20:22 (UTC) - Expand

(no subject)

[identity profile] volodymir-k.livejournal.com - 2014-09-29 17:38 (UTC) - Expand

[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)
Точно не знаю, не пользовался.
Если Минск, то могу глянуть по старой телефонной базе, в личку фамилию и адрес скиньте.

(no subject)

[personal profile] leotsarev - 2014-10-02 12:08 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2014-10-02 12:16 (UTC) - Expand

(no subject)

[personal profile] leotsarev - 2014-10-02 12:22 (UTC) - Expand