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)
Страшные вещи вы рассказываете... Первая мысль "а вот у нас на маке можно вызывать методы у нулевого указателя!", вторая "блин, я ж писал на винде - никто так не делал, на ноль проверяли явно, и это задалбывало"

[identity profile] bydlorus.livejournal.com 2014-09-29 09:26 am (UTC)(link)
Ну вот, а зачем проверять на ноль, если тебе придёт красивое исключение NullReferenceException и его можно обработать в одном месте? А потом пишешь код проверки доступа и думаешь, как проверить - смотришь, а если доступа нет, то приходит красивое исключение NullReferenceException. И решение в общем-то очевидное - нулевой объект, доступа нет, перехватим исключение и закроем дефект. Так часто и программируют - никто не разбирается, почему тут приходит это число или эта ошибка. Просто закладываются на то, что есть.

[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] aamonster.livejournal.com 2014-09-29 09:45 am (UTC)(link)
Так штука в том, что обычно надо продолжить выполнение, а c++ exceptions этого не умеют.
Итого, для пользования NullReferenceException - надо писать 100500 обработчиков (в каждой функции). Зачастую проще перед каждой строчкой написать if(...), а в Objective C и этого не надо - обращение к методу нулевого объекта ничего не сделает и вернёт (если тип результата не длиннее указателя) ноль (когда пишешь гуйню - удобно, а в нормальном коде всё равно проверки ставить надо).

[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] vp.livejournal.com 2014-09-29 10:16 am (UTC)(link)
Нифига ж себе.

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

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

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

[identity profile] bydlorus.livejournal.com 2014-09-29 10:20 am (UTC)(link)
Да, ребе, именно поэтому программисты иногда бывают столь гомофобны. Потому что они же повсюду!
Edited 2014-09-29 10:20 (UTC)

[identity profile] metaclass.livejournal.com 2014-09-29 10:31 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:56 am (UTC)(link)
Ну тады ой. Впрочем кому-то и кобыла невеста goto любимый инструмент может быть.

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

[identity profile] maxdz.livejournal.com 2014-09-29 11:06 am (UTC)(link)
эксэпшн != лонгджамп

[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] http://users.livejournal.com/_slw/ 2014-09-29 11:34 am (UTC)(link)
хаскель?

[identity profile] veter-r-r.livejournal.com 2014-09-29 11:38 am (UTC)(link)
там не на исключениях, а на психотропах

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

Page 1 of 4