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

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

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

[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 (через сигналы и дизассемблирование инструкций по адресу в стеке), так, чтобы тест отрабатывал.

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

[identity profile] cross-join.livejournal.com 2014-09-29 09:45 am (UTC)(link)
Для систем класса СУБД ненормально, лишние затраты, время и т.д.
Для ООП в целом - стандартный подход, исключение - это способ послать сообщение.
Отсюда вывод, для написания СУБД надо уметь оба подхода.

[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 (без плюсов).

[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)
А есть языки, в которых логику на исключениях делать хорошо?

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

[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). Однако даже в этом случае, чтобы дойти до нужного адресата, Вам понадобится хотя бы ФИО, либо адрес, либо телефон. Но это самая простая ситуация, и если человек долго проживает и прописан в Беларуси, то отыскать его не должно составить труда.

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