X> эта удобность может обойтись слишком дорого. X> имени файла и строки, достаточно для выявления ошибки в 99%.
Слишком дорого? А как же лишние часы, потраченные на попытку понять причину возникновения ошибки, кол-во которых могло бы уменьшиться, если бы у программиста был call stack?
Здравствуйте, FrozenHeart, Вы писали:
FH>Слишком дорого? А как же лишние часы, потраченные на попытку понять причину возникновения ошибки, кол-во которых могло бы уменьшиться, если бы у программиста был call stack?
Есть разные подходы к вопросу...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, FrozenHeart, Вы писали:
FH>Сузить, но не сократить до минимума.
а еще, было бы здорово, если бы исключение само лечило причину своего выброса.
FH>Хотя, всё зависит от проекта.
а какая разница? используемая IDE не показывает вызывающих?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, FrozenHeart, Вы писали:
FH>Слишком дорого? А как же лишние часы, потраченные на попытку понять причину возникновения ошибки, кол-во которых могло бы уменьшиться, если бы у программиста был call stack?
мне не нужен call-stack.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Наилучшая практика — ПРОЕКТИРОВАТЬ обработку ошибок.
И по возможности — выделять это в отдельную подсистему, для полной инкапсуляции обработки.
Но так редко удается, хотя к этому надо стремиться.
Возможно, наилучшим решением был бы аспектно-ориентированный подход.
Но я не знаю подобных решений для С++.
Кто бы занялся?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Наилучшая практика — ПРОЕКТИРОВАТЬ обработку ошибок.
т.е. не использовать исключения, а использовать коды ошибок?
LVV>хотя к этому надо стремиться.
зачем?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали: X>Здравствуйте, FrozenHeart, Вы писали: FH>>Слишком дорого? А как же лишние часы, потраченные на попытку понять причину возникновения ошибки, кол-во которых могло бы уменьшиться, если бы у программиста был call stack? X>мне не нужен call-stack.
Это лукавство, или я не увидел в вашем профиле емайла Чака Нориса?
Может я конечно и тупой, но мне часто и стек не помогает понять причину падения,
даже если есть полные дампы — не могу однозначно получить ответ почему упало
приложение,как повторить ситуацию в отладке и исправить.
если в код вкралась какая-то нереально сложная ошибка — мы собираем продукт в релизе но с отладночной инфой, и запускаем его под дебаггером. дебагер заскриптован, и в случае чего-то неординарного — создает core-dump, сохраняет call-stack, аргументы функции, локальные переменные, и еще выполняет всякое что там в скрипте записано.
а в штатном использовании программы, ничего более чем file:line не нужно.
PPA>Считаю, что стек падений может быть не нужен только в одном случае — вашим кодом никто не пользуется.
есть три типа программистов:
1. хорошие.
2. плохие.
3. отрицающие, что они плохие.
зы
как пример, приведу ситуацию из реальной жизни. недели две назад закончил реализацию некоторого механизма зеркалирования и отката состояния группы игровых серверов. получилось ~30000 loc. код писал я сам. дебагер был использован один раз.
но, вы можете не верить, дело ваше.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>если в код вкралась какая-то нереально сложная ошибка — мы собираем продукт в релизе но с отладночной инфой, и запускаем его под дебаггером.
кстати да, после того как в GCC добавили AddressSanitizer и UndefinedBehaviorSanitizer — думаю мы и вовсе перестанем использовать дебаггер для подобных случаев.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, LaptevVV, Вы писали:
LVV>>Наилучшая практика — ПРОЕКТИРОВАТЬ обработку ошибок. X>т.е. не использовать исключения, а использовать коды ошибок?
Нет.
Проектировать — это не значит закладываться на конкретную реализацию.
Это значит, что помимо всех правильных ситуаций в системе надо спроектировать и возможные неправильные.
А потом подумать об централизованной обработке.
LVV>>хотя к этому надо стремиться. X>зачем?
Чтобы подобных вопросов не задавать на форумах...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
X> если в код вкралась какая-то нереально сложная ошибка — мы собираем продукт в релизе но с отладночной инфой, и запускаем его под дебаггером. дебагер заскриптован, и в случае чего-то неординарного — создает core-dump, сохраняет call-stack, аргументы функции, локальные переменные, и еще выполняет всякое что там в скрипте записано. X> а в штатном использовании программы, ничего более чем file:line не нужно.
Т.е. Вы дожидаетесь возникновения проблемы у клиентов, после чего, имея при себе лишь имя файла, название функции и строку, из которой было выброшено исключение, пытаетесь воспроизвести её на своих системах? А если воспроизвести не получится? А если вариантов вызова throw слишком много? А что, если они зависят от того, откуда именно Вы пришли в данную функцию? Не лучше ли было бы иметь при это хотя бы call stack?
Кстати, кто-нибудь знает в итоге ответ на следующий вопрос:
FH> Нужна конструктивная критика данного подхода и ответ на следующий вопрос — видел, что некоторые при выбрасывании исключения добавляют к нему информацию об оригинальном типе исключения
FH>
Здравствуйте, LaptevVV, Вы писали:
LVV>Это значит, что помимо всех правильных ситуаций в системе надо спроектировать и возможные неправильные.
контрактное программирование?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, LaptevVV, Вы писали:
LVV>>Это значит, что помимо всех правильных ситуаций в системе надо спроектировать и возможные неправильные. X>контрактное программирование?
Еще ДО.
Контрактное программирование — это конкретная технология реализации.
А тут в принципе надо решать вопрос: а что будет, если случится вот это?
В одних случаях — ничего страшного.
А в других — "ой, ребята, я пошла, мне что-то нехорошо...".
А сколько я видел проектов, нигде проектирования вариантов аварийных ситуаций в голову не приходит.
Инструменты проектирования не настаивают на этом.
Только в ДРАКОНЕ — обязательными являются побочные ветви. Так он и сделан в космической отрасли.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, niXman, Вы писали: PPA>>или я не понял как без стека узнать кто позвал метод... X>эта информация не первостепенной важности. X>зная где исключение было выброшено, позволяет сузить понимание причины его возникновения.
Пока не понимаю.
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytesvoid *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memorystatic const std::bad_alloc nomem;
_RAISE(nomem);
}
Здравствуйте, FrozenHeart, Вы писали:
FH>Т.е. Вы дожидаетесь возникновения проблемы у клиентов
что значит "дожидаетесь"? у нас есть отдел тестирования. значит да, дожидаемся что у конечного пользователя ничего страшного не произойдет.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>это же нелепый пример.
не могу представить, как такое может произойти у конечного юзера...
допустим, размер обрабатываемых программой абстрактных данных, приходит откуда-то извне, к примеру по сети в виде строки. но тогда тут должен быть валидатор, и это требование должно быть заложено в архитектуру.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)