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

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

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

[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. И решение в общем-то очевидное - нулевой объект, доступа нет, перехватим исключение и закроем дефект. Так часто и программируют - никто не разбирается, почему тут приходит это число или эта ошибка. Просто закладываются на то, что есть.

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

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

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

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

[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] 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] 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)
Чёрт, у меня открылись глаза. Это гораздо более простое объяснение того, почему вин программисты использовали это исключение...