
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (15) « Первая ... 2 3 [4] 5 6 ... 14 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Цитата Qraizer @ Им просто не повезло: класс с которым они должны взаимодействовать стал невалидным. В любом же другом случае, объясни, плз, чем провинились другие классы и экземпляры? Цитата Qraizer @ Начиная с "молотком привел экземпляр..." пожалуйста поподробнее. Что ты имеешь в виду? А проблема конкретного экземпляра конкретного класса решается куда изящнее ...исключением, которое нигде не перехватывается. Поставил обработчик неперехваченных, получил в нём это особое исключение, вытащил оттуда нужную инфу, молотком привёл экземпляр во вменяемое состояние, заменил на нормальное исключение, бросил, размотал стек и вышел. |
![]() |
Сообщ.
#47
,
|
|
Сделал его инвариантным, чтобы мог нормально деструкнуться.
Добавлено Например, тупо выставить поле m_size в 0 у контейнера. |
Сообщ.
#48
,
|
|
|
Цитата Qraizer @ А проблема конкретного экземпляра конкретного класса решается куда изящнее ...исключением, которое нигде не перехватывается. Поставил обработчик неперехваченных, получил в нём это особое исключение, вытащил оттуда нужную инфу, молотком привёл экземпляр во вменяемое состояние, заменил на нормальное исключение, бросил, размотал стек и вышел. По-моему и у нас с тобой случился разговор из разряда: - трава же зеленого цвета?! - нет, пол-восьмого! ![]() Процитированное тобой именно я и утверждал выше. Ловим возможные исключения. Если удается привести процесс выполнения в нужное состояние - приводим в обработчиках исключений. Если не получается -> вывод причины + отмена операции (или вовсе полное завершение программы). А ты мне про какие-то длинные прыжки рассказываешь ![]() |
Сообщ.
#49
,
|
|
|
Цитата Qraizer @ Весьма плохо себе это представляю. Допустим из-за переполнения буфера в сторонней библиотеке, указатель на некий объект стал указывать неизвестно куда. Каким интересно молотком его выравнивать? Сделал его инвариантным, чтобы мог нормально деструкнуться. |
Сообщ.
#50
,
|
|
|
Цитата applegame @ Допустим из-за переполнения буфера в сторонней библиотеке, указатель на некий объект стал указывать неизвестно куда. Каким интересно молотком его выравнивать? Лично я бы в таком случае реализовал выход из программы по assert'у. Чужие либы с багами - это мина на неизвлечении. |
Сообщ.
#51
,
|
|
|
Впрочем во многом Qraizer прав. В общем случае ассерты вполне себе годная штука, но реализация их в C++ все же корявая. Я так подумал, на самом деле ассерты в виде полноценных исключений, мне нравятся больше (в D именно такие). Просто нужно нарисовать грамотную иерархию исключений. Например создать некий assert_error, который унаследовать от std::logic_error и в большинстве случаев, вместо ассертов, спокойно кидаться им. Иногда ассерты ловить полезно, у меня есть моменты в проекте (на D), где нарушение инварианта - вполне себе обрабатываемое событие: просто убивается файбер/сопрограмма вместе с UB, которое создалось из-за нарушения контрактов. Само приложение продолжает работать. А возникшее UB обнаружитвается в логах и впоследствии лечится.
|
Сообщ.
#52
,
|
|
|
Просто assert'ы были сделаны не для C++. И планировалось пользоваться ими только для целей нарушения условий, в основном во время отладки. Поэтому при объявлении NDEBUG ассерты превращаются в простые нолики. Поэтому и работают не так, как следовало бы, чтобы они нормально вписывались в C++.
Для C++ действительно лучше иметь отдельную от C реализацию такой проверки. |
![]() |
Сообщ.
#53
,
|
|
Цитата JoeUser @ Правильно. Холивар о goto можно закрывать."Неструктурным черным ящичкам" - жить! amk, тут дело даже не в языке, по-моему. Просто с тех бородатых времён, когда C только появился, сами технологии проектирования ПО изменились. Сейчас даже в C просто прибивать процесс assert()-ом не всегда удачная идея при нынешнем положении дел в индустрии. Добавлено Цитата applegame @ Та хоть new char. Не всё ли равно? Лишь бы delete в деструкторе ублажить. Допустим из-за переполнения буфера в сторонней библиотеке, указатель на некий объект стал указывать неизвестно куда. Каким интересно молотком его выравнивать? Добавлено P.S. Ты, видимо, не знаком с принципами проектирования критически надёжного кода. Ну, это моя вина, я только с таким последние 10 лет только и связан по роду деятельности, поэтому как-то уже не приемлю других критериев просто по привычке. Один из основополагающих факторов – отказ работоспособности одной подсистемы не должен приводить к отказам в других. Так что проблемы конкретного объекта должны оставаться его личными проблемами. |
Сообщ.
#54
,
|
|
|
Цитата Qraizer @ Не то чтобы совсем не знаком. Но опыта маловато. Фактически только последний проект стараюсь писать с подобным подходом. Так как терять реальные деньги из-за несмертельных ассертов не хочется. P.S. Ты, видимо, не знаком с принципами проектирования критически надёжного кода. Ну, это моя вина, я только с таким последние 10 лет только и связан по роду деятельности, поэтому как-то уже не приемлю других критериев просто по привычке. Один из основополагающих факторов – отказ работоспособности одной подсистемы не должен приводить к отказам в других. Так что проблемы конкретного объекта должны оставаться его личными проблемами. |
Сообщ.
#55
,
|
|
|
Стоп, а вы про классические assert'ы говорите, которые из #include <assert.h>? Эти вообще нигде и никак не надо использовать. Вместо них нужны свои макросы, которые и дамп для отладчика сделают, и все логи корректно закроют, и всякую другую полезную информацию сохранят (посмертный скриншот например и значения ключевых данных).
|
Сообщ.
#56
,
|
|
|
Цитата Pacific @ Эти вообще нигде и никак не надо использовать. Прям вот так вот категорично? А если мне не нужны скриншоты, если логирование не имеет своей собственной буферизации(т.е. достаточно того, что файлы будут закрыты при смерти процесса), если для отладки мне вполне достаточно корки, которую сделал этот самый assert? |
Сообщ.
#57
,
|
|
|
Цитата Pacific @ А также посмертный список паролей, адресной книги и прочей неконфиденциальной информации. посмертный скриншот например ![]() |
Сообщ.
#58
,
|
|
|
Цитата D_KEY @ Прям вот так вот категорично? А если мне не нужны скриншоты, если логирование не имеет своей собственной буферизации(т.е. достаточно того, что файлы будут закрыты при смерти процесса), если для отладки мне вполне достаточно корки, которую сделал этот самый assert? А вызов abort откладывает корку? Давно я это говно не вызывал... В любом случае, отладчики с этим говном дружат плохо, что выявляется при попытке воспроизвести баг. Сишные ассерты должны умереть. |
Сообщ.
#59
,
|
|
|
applegame
Я про внутренние билды для тестеров говорю. |
Сообщ.
#60
,
|
|
|
Цитата MyNameIsIgor @ Сишные ассерты должны умереть. Кому должны? Умирает то, что не используют. Они итак еле живы, но иногда их используют, а значит и умирать они не должны. |