|
16 / 0 / 2
Регистрация: 10.11.2012
Сообщений: 117
|
|
Способы обработки ошибочных ситуаций02.08.2015, 22:31. Показов 4442. Ответов 28
Метки нет (Все метки)
Добрый вечер!!
Расскажите ваше мнение на тему обработки ошибок, как лучше реализовать? Заранее благодарю вас за ответы!!
0
|
|
| 02.08.2015, 22:31 | |
|
Ответы с готовыми решениями:
28
Обработка ошибочных ситуаций с использованием исключений Обработки исключительных ситуаций Есть ли в SQL аналог обработки исключительных ситуаций? |
|
55 / 55 / 39
Регистрация: 19.03.2015
Сообщений: 167
|
|
| 02.08.2015, 22:48 | |
|
с помощью исключений
1
|
|
|
16 / 0 / 2
Регистрация: 10.11.2012
Сообщений: 117
|
|
| 02.08.2015, 22:50 [ТС] | |
|
А можно поподробнее) Или может книгу посоветуете?
0
|
|
|
55 / 55 / 39
Регистрация: 19.03.2015
Сообщений: 167
|
|
| 02.08.2015, 23:02 | |
|
в случае обнаружения ошибки исключения позволяют прервать поток выполнения программы и передать упралвение обработчику ошибок.
исключения описаны в любом учебнике по C++. например Бьерн Страуструп - Язык программирования C++. еще очень хорошая книга - Брюс Эккель, Чак Эллисон - Философия C++
1
|
|
|
Ушел с форума
|
||
| 02.08.2015, 23:55 | ||
Сообщение было отмечено Ilot как решение
РешениеМногие почему-то этого не делают. Если некая функция может вернуть false, вы обязаны проверить это. Если в программе вызывается три сотни разных функций, каждая из которых может завершиться ошибкой, вы обязаны написать код проверки возвращаемого значения к каждой из них. Если метод некоего класса может выбрасывать исключение, вы не должны помещать код его вызова в try/catch с пустым блоком catch - это худшее, что можно придумать. Если некая операция или последовательность операций завершается неудачей, то самое плохое, что можно в этом случае сделать - тихо замолчать факт ошибки или, что еще хуже, попытаться выполнить ту же операцию, но каким-то другим способом. Не следование этому простому, на первый взгляд, принципу, влечет за собой то, что лично я называю "пробрасывание ошибки" или "распостранение ошибки". Вместо того, чтобы быть пойманной и четко классифицированной сразу по месту возникновения, вместе с кодами исключения, стек-трейсом и другой полезной информацией, ошибка маскируется и плавает в программе где-то на дне еще некоторое время, после чего все равно всплывает, но уже совершенно в другом месте и с гораздо более невнятными симптомами, когда возможности для ее диагностики уже нет. Искать такие ошибки, как правило, уже бесполезно. Суть качественной обработки ошибок - максимально резкая реакция на их возникновение, вместе со сбором максимально полной информации о контексте. Разумеется, есть ошибки логические, которые являются ожидаемыми, например, невозможность сохранить данные в файл из-за отсутствия прав на запись. В этом случае, очевидно, следует показать пользователю какое-то осмысленное, "человеческое" сообщение и продолжить работу адекватным и наиболее ожидаемым для него способом. Все остальное, что попадает в класс "unexpected", "overflow", "no memory", деление на ноль и т.п., должно обрабатываться соответствующим образом. 2) Принцип в пункте 1 распостраняется на ключевые аспекты архитектуры приложения. Если есть некий API, он должен быть спроектирован так, чтобы его можно было использовать лишь одним, и никаким другим способом. И при попытке хоть что-то сделать не так должна возвращаться ошибка. Если некий клиентский код, работая с нашим протоколом обмена данными, посылает их не в том порядке, не с теми заголовками, с неверной длиной и т.п., то ни в коем случае не следует пытаться "угадать" намерения клиента. Снова лучшая стратегия здесь - сразу прервать обработку и вернуть соответствующий код ошибки. Как привередливая и чрезмерно внимательная к деталям тетка. Вообще, чем уже "коридор" выполнения кода, тем меньше возможностей где-то накосячить и сойти пути, который был намечен разработчиком. Это один из ключевых принципов. 3) Не следует пытаться "восстановиться" после какой-то критической ошибки. Самое лучшее и простое - дать программе просто упасть, сообщив пользователю о том, что произошло, ну возможно еще снять крэш-дамп и создать логи. Не следует применять здесь какие-то "умные" стратегии, они все равно будут нелепы. 4) Слой обработки ошибок должен быть четко отделен от слоя бизнес-логики приложения. Иначе вы рискуете получить спагетти-код, нашпигованный if-ами через каждые три строчки. Такой код очень трудно понимать, т.к. "лес" не видно за "деревьями". Исключения обычно помогают достичь этой цели, к тому же их, в отличие от true/false и кодов возврата, нельзя проигнорировать. То есть, где-то на низком уровне мы пишем реализацию, со всеми свойственными ей заморочками, детализацией, проверкой ошибок и т.п., а сверху должен быть простой, очевидный, компактный и самодокументированный код, чтобы одного взгляда на который для любого смертного, даже не знакомого с программированием, хватило бы для понимания того, что этот код делает. 5) "Исключения vs коды возврата" - руководствуемся соображениями пункта 4 (исключения позволяют этого достигнуть), а также тем, что в объект исключения можно запихнуть любое количество полезной информации. Но при этом учитываем перфоманс (коды быстрее) и вопросы переносимости (выброс исключения даже за пределы модуля уже может привести к проблемам, а из-за отсутствия ABI они не совместимы между компиляторами и, иногда, между разными версиями одного и того же компилятора). 6) Ассерты, проверки инвариантов и тому подобное, должны быть расставлены на каждом шагу. Это помогает отслеживать возникновение ошибок при внесении изменений в код, что очень важно. Хороший ассерт, который вдруг выстрелил, сразу дает понять, что именно произошло и почему.
12
|
||
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
|||||||
| 10.07.2016, 08:12 | |||||||
0
|
|||||||
|
Ушел с форума
|
|
| 10.07.2016, 08:27 | |
|
Можно заменить new на какую-нибудь функцию/макрос, которая будет делать
try/catch и формировать всю нужную информацию в случае возникновения исключения. А можно вообще не перехватывать bad_alloc. Все-таки это критическая ситуация, в которой вряд ли получится что-то сделать. Пускай программа сразу падает. Далее система создаст крэш-дамп и по нему уже можно будет разбираться - то ли памяти в системе не хватило, то ли упало как итог утечки, которую надо чинить.
1
|
|
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 10.07.2016, 12:55 | |
|
Ошибки бывают разные.
И я всё больше склоняюсь к тому, чтобы использовать исключения только для обрушения программы. Во всех остальных случаях, когда программа должна достичь некоторого определённого результата, использовать или вычисления в контексте, если средства языка позволяют, или коды ошибок, если важна производительность либо язык не позволяет. Исключения, на мой взгляд, особенно неудачны, когда речь идёт о "graceful degradation".
0
|
|
|
Неэпический
|
|||
| 10.07.2016, 13:05 | |||
|
в зависимости от реализации самого механизма исключений и реализации других способов обработки ошибок. По теме: https://habrahabr.ru/post/208006/ Но, имхо, пихать всюду исключения тоже не есть хорошо. Всё-таки, большую часть проблем можно решить "на месте", без обращения к "вышеисполняющемуся" коду. после исключения пытается восстановить упавшую часть. Конечно, если не удается это сделать, то завершаем работу, ибо дальше нет смысла работать. Одно из хороший свойств исключений - про них нельзя просто так забыть. Конечно, можно блок catch пустой оставить, но, это уже сознательный пропуск.
0
|
|||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||
| 10.07.2016, 13:12 | ||
|
Да и про коды ошибок... Если код правильно организован с логической точки зрения. А намеренно пропустить можно и исключения, как Вы сами упомянули.
0
|
||
|
Неэпический
|
||
| 10.07.2016, 13:15 | ||
|
Функция не моя, кидает исключения, зараза, при ошибке. Но мне её результат не так и важен, можно его просто игнорировать... пришлось запихнуть в try и пустой catch оставить (запись в лог всё-таки сделал, правда, пока еще ни разу её там не видел)
0
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 10.07.2016, 15:41 | ||
|
Ошибка - это когда на одном из уровней (чаще всего на самом нижнем) возникает ситуация на которую непонятно как реагировать и предварительная проверка ничего не дает. В этом случае есть выбор - продолжить работать с наглой мордой, как будто ничего не произошло (как принято на маках) или прекратить работу с сообщением об ошибке.
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 10.07.2016, 16:53 | ||
|
Можно замутить монадический стиль обработки ошибок (на основе std::optional) так, как это делается в Haskell, Rust и тд и тп.
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 10.07.2016, 17:14 | ||
|
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 10.07.2016, 18:33 | |
|
Croessmah, ждать поддержки компиляторами конечно же!
А так уже все определились с тем, что в С++17 будет, а что нет.nodiscard будет в ближайших релизах, gcc и clang уже имеют его в мастере. С точки зрения ошибок может быть еще удобна фича structured bindings, но ее еще не делали. Добавлено через 6 минут Я вообще про то, что C++ эволюционирует, и казалось бы очевидные и общепринятые подходы к стилю кодирования надо постоянно пересматривать, пробовать что-то новое и тд. Как бы понятно, что всегда я был за исключения, но сейчас вот будет например какая-то адекватная альтернатива - и это хорошо, можно опробовать ее и понять, когда что реально удобно.
1
|
|
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
||
| 05.08.2016, 12:46 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 05.08.2016, 23:13 | ||||
|
отказал двигатель. вообще то есть запасной. и даже код написан, который умеет включать аварийный двигатель, когда поймает исключение об аварийном отказе основного. так мы будем восстанавливаться после паники, или будем ронять самолет со всеми людьми на борту? как компилятор вежливо напомнит про обработку. но есть ещё третий вариант: "строгие гарантии", с возможностью полного восстановления после паники (гарантии ликвидации последствий аварии)
1
|
||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 05.08.2016, 23:28 | |
|
hoggy, я вроде писал уже:
либо просто атрибут nodiscard - тогда ворнинг либо явный монадический тип в возвращаемом значении (std::optional) - тогда ошибка компиляции
0
|
|
| 05.08.2016, 23:28 | |
|
Помогаю со студенческими работами здесь
20
ряды и способы их обработки Способы обработки сообщений windows Какие способы самые удобные/рациональные способы регистрации ошибок есть? Контроль ввода ошибочных значений Выборка ошибочных данных, возможна? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|