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

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

Восстановить пароль Регистрация
 
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
30.12.2011, 18:47     Типы ошибок(не синтактические) и что с ними делать. #1
Ошибки пользователя.
Программа просит пользователя ввести число, а он вводит букву.
В данном случае, можно попросить снова пользователя вести число.
Ошибки разработчика(логическая ошибка, runtime error).
Например, выход за границу вектора.
Что делать, когда возникают такие ошибки?
Ошибки, независящие от разработчика или пользователя.
Например, не получилось выделить память для объекта( выкидывает исключение типа bad_alloc ).
Для этого случая можно попробовать снова попробовать выделить память(наверно не всегда хороший вариант) или закрыть программу или еще что-нибудь.
Другие ошибки. Не знаю какие.


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

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

типы ошибок программирования C++
C++ Линейный поиск ошибок, что то не так
C++ подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать
C++ Что мне делать или что надо знать перед тем как начать изучение яз.программирования С/С++?
сообщение что исходный файл не откомпилирован что делать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.12.2011, 19:44     Типы ошибок(не синтактические) и что с ними делать. #2
асерты используют при отладке, скажем так это чисто для программиста, чтобы знать где и в какой строке, для этого так же можно использовать и исключения но механизм исключений более гибкий и позволяет переложить решение "что делать" на пользователя, а пользователю вовсе не надо знать где и в какой строке кто-налажал произошла ошибка
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.12.2011, 19:49     Типы ошибок(не синтактические) и что с ними делать. #3
Цитата Сообщение от Chelioss Посмотреть сообщение
Что делать, если произошла логическая ошибка и ее программа нашла? Например, исключение при выходе за границу вектора. Сказать, что произошла ошибка и выключить программу?
Отлаживать код до тех пор, пока в нем не останется подобных ошибок. Если же по какой-то причине избежать их не возможно, то, как сказали выше, исключения. Ассерт - это по сути отладочный инструмент.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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 или освободить память, очистив содержимое какого-нибудь кэша... Но в целом, закрываться.
Yandex
Объявления
30.12.2011, 19:57     Типы ошибок(не синтактические) и что с ними делать.
Ответ Создать тему
Опции темы

Текущее время: 23:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru