даёт функции успешно завершиться (возможно, не может даже начаться): 1.Нарушены предусловия. Например: передача float вместо int 2.Нет возможности выполнить постусловие. Должна вернуть значение – не может его получить. 3.Нет возможности восстановить инвариант, за поддержку которого она отвечает.
– неправильно написан код. Ошибки в логике программы, которые происходят из-за неправильно написанного кода, т.е. это ошибки программиста. Исключительная ситуация – ошибка возникает по независящим от нас обстоятельствам от взаимодействия с внешними ресурсами.
сохранении файла на диск оказалось, что место на диске кончилось. • Удалённый сервер недоступен. • Видео модуль не загрузился, т.к. на компьютере не оказалось соответствующего кодека. • Разыменование нулевого указателя при попытке обратиться к видео модулю, который не загрузился. • У сайта оказался некорректный SSL сертификат. • Выход за границу массива при обработке некорректного SSL сертификата.
сохранении файла на диск оказалось, что место на диске кончилось. • Удалённый сервер недоступен. • Видео модуль не загрузился, т.к. на компьютере не оказалось соответствующего кодека. • Разыменование нулевого указателя при попытке обратиться к видео модулю, который не загрузился. • У сайта оказался некорректный SSL сертификат. • Выход за границу массива при обработке некорректного SSL сертификата.
программы помогает понять, что с ней происходит. • Что логировать? • Время, уровень, место, где происходит ошибка, сообщение • Зачем логировать? Понимать, что происходит!
только описание ошибки, но и полное состояние программы во время падения. Пример инструментов: Google break-pad или Microsoft minidumps Что полезно: раскрутить стеки, понять, что где вызывалось Бибилотеки, которые использует приложение, их местоположение Если сборка релизная, то многое может быть непонятно в результате работы компилятора Если есть дамп памяти, можно под дебагером его загрузить (они тяжёлые)
и вернуть какое-нибудь невалидное значение (false, -1 и т.д.) - Вернуть невалидное значение не всегда возможно - Возникают сложности в многопоточном приложении. Если она правда глобальная на программу, то потоки будут конфликтовать за пользование этой переменной. Как решается эта проблема?
Иногда функция возвращает код завершения, он же код ошибки, если имеет ненулевое значение; в других случаях часть диапазона значений функций выделена под коды ошибки. + Работает, С библиотеки так и работают. – часто забывают проверить – приводит к разбуханию кода
информацией об ошибке. Реализован механизм его удобной передачи от места возникновения до места обработки. • В месте возникновения ошибки исключение «бросается», в месте обработки «ловится».
• выносит обработку из основного потока выполнения • незаменимо в конструкторах и операторах. У них нет возвращаемого типа, так что нельзя вернуть код ошибки. Проблемы?
Разделять ошибки программиста и исключительные ситуации • Использовать assert • Использовать только стандартные классы исключений или производные от них • Бросать по значению, отлавливать по ссылке. Почему? • Отлавливайте все исключения в точке входа
Обрабатываемая ошибка просходит нечасто. • Ошибка серьёзная,и без её обработки невозможно дальнейшее исполнение программы. • Ошибка не может быть обработана там, где она возникла. • Нет более подходящего способа вернуть код ошибки.
объекта и сообщить об ошибке. • Исключения, которые вылетают из конструктора, корректно обрабатываются. При исключении в конструкторе не будет вызван деструктор, потому что деструктор вызывается, если объект уже создан.
message"); 2. int * data = new int[size]; 3. delete [] data; 4. // data_ - это поле класса типа std::vector<string> for (auto s : data_) { len += s.size(); } 5. // data_ - это поле класса типа std::vector<string> size_t len = 0; for (auto & s : data_) { len += s.size(); }
message"); 2. int * data = new int[size]; 3. delete [] data; 4. // data_ - это поле класса типа std::vector<string> for (auto s : data_) { len += s.size(); } 5. // data_ - это поле класса типа std::vector<string> size_t len = 0; for (auto & s : data_) { len += s.size(); }
C++ (продолжение)". Лектор А.В. Смаль. https://stepik.org/course/3206/info • Курс "Программирование на C++, часть 2 (весна 2019)". Лектор В.М. Лесин. https://www.youtube.com/playlist?list=PLlb7e2G7aSpRs7YafQ1GgJvyRku 10m1RN Дополнительные материалы: • Реализация раскрутки стека разными компиляторами C++ https://habr.com/ru/post/208006/