Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

Типы ошибок(не синтактические) и что с ними делать. - C++

30.12.2011, 18:47. Просмотров 827. Ответов 3
Метки нет (Все метки)

Ошибки пользователя.
Программа просит пользователя ввести число, а он вводит букву.
В данном случае, можно попросить снова пользователя вести число.
Ошибки разработчика(логическая ошибка, runtime error).
Например, выход за границу вектора.
Что делать, когда возникают такие ошибки?
Ошибки, независящие от разработчика или пользователя.
Например, не получилось выделить память для объекта( выкидывает исключение типа bad_alloc ).
Для этого случая можно попробовать снова попробовать выделить память(наверно не всегда хороший вариант) или закрыть программу или еще что-нибудь.
Другие ошибки. Не знаю какие.


Вообще я создал тему из-за второго вида ошибок(ошибки разработчика), но может будут замечания и про другие типы ошибок.

Что делать, если произошла логическая ошибка и ее программа нашла? Например, исключение при выходе за границу вектора. Сказать, что произошла ошибка и выключить программу?
Надо ли использовать исключения для этого типа ошибок? Может даже надо только исключения использовать?
А как насчет assert? Где исключения, а где асерты?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2011, 18:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Типы ошибок(не синтактические) и что с ними делать. (C++):

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы - C++
Заранее спасибо.

Почему в конце символьной строки появляются разные символы, и что с ними делать? - C++
В строке, содержащей последовательность слов, найти конец предложения, обозначенный символом "точка". В следующем слове первую строчную...

подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать - C++
Вывод В выходной файл выведите одно число - сколько ударов сделали часы за этот отрезок времени.

сообщение что исходный файл не откомпилирован что делать? - C++
Собственно скачал я dev c++ пишу простую программу #include <iostream> int main() { std::cout << "Hello world!"; ...

Что мне делать или что надо знать перед тем как начать изучение яз.программирования С/С++? - C++
Я пока вообще не умею программировать.Сначала хотел с бейсика или паскаля.Но многие советуют начинать сразу с С/С++.

Заголовочный файл <thread> и все что с ними связано - C++
Доброе время уважаемые форумчани! Проспал((( лекцию по потока, а может и забыл а может и не помнил! Короче, есть задумка, дано: 1)...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.12.2011, 19:44 #2
асерты используют при отладке, скажем так это чисто для программиста, чтобы знать где и в какой строке, для этого так же можно использовать и исключения но механизм исключений более гибкий и позволяет переложить решение "что делать" на пользователя, а пользователю вовсе не надо знать где и в какой строке кто-налажал произошла ошибка
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
30.12.2011, 19:49 #3
Цитата Сообщение от Chelioss Посмотреть сообщение
Что делать, если произошла логическая ошибка и ее программа нашла? Например, исключение при выходе за границу вектора. Сказать, что произошла ошибка и выключить программу?
Отлаживать код до тех пор, пока в нем не останется подобных ошибок. Если же по какой-то причине избежать их не возможно, то, как сказали выше, исключения. Ассерт - это по сути отладочный инструмент.
1
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
30.12.2011, 19:57 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вообще, есть много разной литературы, в которой описаны различные способы категоризации ошибок. Выбрать, который из них единственно правильный довольно трудно.

В языках, где ошибки перехватываются при помощи исключений (java, python...) обычно принято разделение на ошибки компиляции (compile time error) и ошибки времени выполнения (runtime error), причем ошибки времени выполнения (runtime error) можно условно разделить на восстановимые (recoverable) и невосстановимые (fatal).

Ошибки времени компиляции приводят к тому, что код не собирается в исполняемый файл, поэтому про них писать не буду.

Операцию, во время которой произошла восстановимая ошибка, например, некорректный ввод данных, невозможность записать в файл и т.п. можно попытаться повторить или пропустить, если она не обязательная (например, попытка синхронизации времени с удаленным сервером).

Если во время выполнения произошла фатальная ошибка, например, невозможно подключиться к базе данных, без которой корректная работа программы немыслима, приложение нужно остановить (иногда перезапустить).

Опять-таки, это разделение довольно условно и не является каноническим.

В С++ не полностью реализованы исключения. Например, некоторые функции не генерируют исключения, а останавливают программу или возвращают некорректный результат. Поэтому, хотя механизм и есть, он довольно костыльный и для многих штук приходится писать обертки.
C++
1
2
if (someOperatrion(parameters) == -1)
  throw exception("Operation failed");
Но сам по себе механизм обработки исключений сильно облегчает жизнь.

Цитата Сообщение от Chelioss Посмотреть сообщение
А как насчет assert? Где исключения, а где асерты?
Assert это инструмент стандартной библиотеки языка С (не С++). Способ убедиться, что некое значение, критичное для выполнения программы истинно. В противном случае, вызывается abort и программа останавливается. Вообще хитрая штука, ибо генерит SIGABORT, выходит с ошибкой, не освобождает ресурсы, отключается #define NDEBUG и т.п.

Не стоит использовать в С++ коде, пользуйтесь исключениями.

Цитата Сообщение от Chelioss Посмотреть сообщение
Например, исключение при выходе за границу вектора. Сказать, что произошла ошибка и выключить программу?
Да.

Исключительная ситуация на то и исключительная. (ваш, К.О.) Если что-то может теоретически выйти за границу вектора, надо проверять условием. Если не может, это исключительная ситуация. Невосстановимая. Закрываемся.

Цитата Сообщение от Chelioss Посмотреть сообщение
Надо ли использовать исключения для этого типа ошибок? Может даже надо только исключения использовать?
Весьма желательно. Если это возможно, конечно. В С++ механизм исключений довольно корявый и кое-где, к сожалению, просто не выйдет опереться на этот механизм.

Цитата Сообщение от Chelioss Посмотреть сообщение
Для этого случая можно попробовать снова попробовать выделить память(наверно не всегда хороший вариант) или закрыть программу или еще что-нибудь.
Можно попытаться сделать эту ошибку восстановимой. Например, запустить собственный garbage collector или освободить память, очистив содержимое какого-нибудь кэша... Но в целом, закрываться.
4
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2011, 19:57
Привет! Вот еще темы с ответами:

Что из себя представляют типы данных? - C++
Всем привет! Изучаю С++ по книге Шилда Г.С... Прошел тему по Типам данных в С++ и двигаюись дальше... Все что сразу не ясно, со временем...

Двоичные деревья. И что с ними делать? - C (СИ)
Вот написал такой код, а что делать дельше не знаю. #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; typedef struct t_tree {// Для хранение...

Иксы: что с ними делать? удалять или можно еще наладить? - Gentoo Linux
Доброго времени суток. Перестали запускаться иксы, после установки графического терминала. долго уже мучаюсь с этими иксами и подумал,...

IIS5-не выдает описания ошибок что делать ? - C# ASP.NET
Когда я работал на IIS4 то там все было ок. КОгда я перешел на IIS5 то в случае 1) если ошибка возникла на запрашиваемой асп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.12.2011, 19:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru