Здравствуйте, wander, Вы писали:
W>Здравствуйте, niXman, Вы писали:
X>>колбяк написан на С++, но экспортируется как Си-функция?
W>Да. Думаешь это редкость?
Навскидку: libexpat, libpthread. В Win32 API частенько бывает. Да полно примеров.
Здравствуйте, FrozenHeart, Вы писали:
FH>Стоит ли вообще над этим заморачиваться? Мне просто кажется, что лучше уж меньше свободы юзерам дать в этом плане, зато чётко указать своё отношение по данному вопросу в документации, чем иметь в 90% случаев лишний код для поддержки кодов ошибок.
Во-первых, если всё-таки обработку ошибок спроектировать, то вполне можно сделать так, что лишнего кода для поддержки как кодов, так и исключений, будет довольно мало.
Во-вторых, решение на кодах универсальнее, так что если уж от чего-то отказываться, то скорее от исключений, чем от кодов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, FrozenHeart, Вы писали:
X>> всегда поражался такой практике, выделать память при выбросе исключений =) X>> искать последствия такой ситуации будет мучительно больно.
FH>А как иначе? Где-то же эту информацию хранить всё же надо. Ну, не в виде члена класса (я, собственно, об этом и писал, в том числе), а в каком-то другом месте.
можно просто сохранять указатель на данные в стеке, ничего страшного не произойдет
Здравствуйте, FrozenHeart, Вы писали:
FH>Здравствуйте, коллеги.
FH>Задаюсь уже не первый день следующим вопросом — как организовать наиболее опрятную, грамотную, универсальную и удобную в использовании систему исключений в C++?
Самая приятная и простая система обработки ошибок в С++, с которой мне доводилось работать, использовала коды ошибок. Все подсистемы возвращают коды ошибок, весь код написан так, словно ничто не может кинуть исключение, следовательно — не нужно париться насчет exception safety, думать о том, останутся ли данные в памяти в целостном состоянии, после обработки исключения и тд. Исключения используются только как panic — приложение кидает исключение тогда, когда не знает как обработать ошибку и желает от нее умереть. Исключения не обрабатываются и приводят к падениям, стектрейсам и дампам, которые просто анализировать, так как исключения не перевыбрасываются никогда. Ес-но исключения обрабатываются в тех случаях, когда приходится работать с кодом, написаном в другом стиле, где все ошибки возвращаются через исключения.
Подход конечно очень специфичен и не претендует на универсальность.
Здравствуйте, niXman, Вы писали:
X>зы X>как пример, приведу ситуацию из реальной жизни. недели две назад закончил реализацию некоторого механизма зеркалирования и отката состояния группы игровых серверов. получилось ~30000 loc. код писал я сам. дебагер был использован один раз. X>но, вы можете не верить, дело ваше.
Пример из реальной жизни №1 — приложение с отладочной инфой, но под отладчиком в production работать не может из-за тормозов, а если снизить нагрузку — бага не воспроизводится.
Пример из реальной жизни №2 — бага воспроизводится у клиента, а у нас не воспроизводится, а у клиента служба безопасности не разрешает удаленную отладку.
FH>До недавнего времени во всех своих проектах я поступал следующим образом: FH>- Придерживался правила "Всегда выбрасывать исключения, если для сигнализации ошибки функции требуется больше, чем переменная типа bool в виде возвращаемого значения". Просадок в производительности в нашей предметной области это не вызывало, так что такой подход никакого заметного оверхеда не вносил.
Придерживаtся правила "никогда не выбрасывать исключения, исключения для драйверов"