Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс весна 2022 – 2 занятие

ТиМПИ
February 22, 2022

Программирование – 1 курс весна 2022 – 2 занятие

ТиМПИ

February 22, 2022
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 2/35 2/35 Что такое ошибка? Ошибка – сбой, который не

    даёт функции успешно завершиться (возможно, не может даже начаться): 1.Нарушены предусловия. Например: передача float вместо int 2.Нет возможности выполнить постусловие. Должна вернуть значение – не может его получить. 3.Нет возможности восстановить инвариант, за поддержку которого она отвечает.
  2. 3/35 3/35 Ошибка программиста и исключительная ситуация 1/3 Ошибка программиста

    – неправильно написан код. Ошибки в логике программы, которые происходят из-за неправильно написанного кода, т.е. это ошибки программиста. Исключительная ситуация – ошибка возникает по независящим от нас обстоятельствам от взаимодействия с внешними ресурсами.
  3. 4/35 4/35 Ошибка программиста и исключительная ситуация 2/3 • При

    сохранении файла на диск оказалось, что место на диске кончилось. • Удалённый сервер недоступен. • Видео модуль не загрузился, т.к. на компьютере не оказалось соответствующего кодека. • Разыменование нулевого указателя при попытке обратиться к видео модулю, который не загрузился. • У сайта оказался некорректный SSL сертификат. • Выход за границу массива при обработке некорректного SSL сертификата.
  4. 5/35 5/35 Ошибка программиста и исключительная ситуация 3/3 • При

    сохранении файла на диск оказалось, что место на диске кончилось. • Удалённый сервер недоступен. • Видео модуль не загрузился, т.к. на компьютере не оказалось соответствующего кодека. • Разыменование нулевого указателя при попытке обратиться к видео модулю, который не загрузился. • У сайта оказался некорректный SSL сертификат. • Выход за границу массива при обработке некорректного SSL сертификата.
  5. 6/35 6/35 Определение ошибок на этапе разработки • Static_assert позволяет

    определять ошибки на этапе компиляции. • Пример: • Assert позволяет определять ошибки на этапе выполнения. • Пример: Только на время разработки!
  6. 7/35 7/35 Журналирование (логирование) • boost_log • Наличие журнала работы

    программы помогает понять, что с ней происходит. • Что логировать? • Время, уровень, место, где происходит ошибка, сообщение • Зачем логировать? Понимать, что происходит!
  7. 8/35 8/35 Crash reporting При возникновении ошибки возможно получить не

    только описание ошибки, но и полное состояние программы во время падения. Пример инструментов: Google break-pad или Microsoft minidumps Что полезно: раскрутить стеки, понять, что где вызывалось Бибилотеки, которые использует приложение, их местоположение Если сборка релизная, то многое может быть непонятно в результате работы компилятора Если есть дамп памяти, можно под дебагером его загрузить (они тяжёлые)
  8. 9/35 9/35 Исключительные ситуации в программе Найти ошибку Передать к

    месту обработки Решить, что с ней делать Может происходить в разных местах программы
  9. 11/35 11/35 Как обработать ошибку? 1/4 Возврат статуса операции Вставить

    глобальную переменную и вернуть какое-нибудь невалидное значение (например, false) Вернуть код ошибки Остановить программу Сгенерировать исключение
  10. 12/35 12/35 Как обработать ошибку? 2/4 • Возврат статуса операции:

    • Нет информации об ошибке • Изменили сигнатуру функции
  11. 13/35 13/35 Как обработать ошибку? 3/4 • Вставить глобальную переменную

    и вернуть какое-нибудь невалидное значение (false, -1 и т.д.) - Вернуть невалидное значение не всегда возможно - Возникают сложности в многопоточном приложении. Если она правда глобальная на программу, то потоки будут конфликтовать за пользование этой переменной. Как решается эта проблема?
  12. 14/35 14/35 Как обработать ошибку? 4/4 • Вернуть код ошибки.

    Иногда функция возвращает код завершения, он же код ошибки, если имеет ненулевое значение; в других случаях часть диапазона значений функций выделена под коды ошибки. + Работает, С библиотеки так и работают. – часто забывают проверить – приводит к разбуханию кода
  13. 15/35 15/35 Исключения 1/3 • Исключение – это объект с

    информацией об ошибке. Реализован механизм его удобной передачи от места возникновения до места обработки. • В месте возникновения ошибки исключение «бросается», в месте обработки «ловится».
  14. 16/35 16/35 Исключения 2/3 • невозможно игнорировать • распространяется автоматически

    • выносит обработку из основного потока выполнения • незаменимо в конструкторах и операторах. У них нет возвращаемого типа, так что нельзя вернуть код ошибки. Проблемы?
  15. 17/35 17/35 Исключения 3/3 Проблемы • Разбухание кода • Издержки

    компилятора • В плюсах старых версий не применяется, осуждается наравне с GOTO (почему?) • Обязательно использование RAII
  16. 18/35 18/35 Stack unwinding 1/5 • При возникновении исключения объекты

    на стеке уничтожаются в естественном (обратном) порядке.
  17. 19/35 19/35 Stack unwinding 2/5 • При возникновении исключения объекты

    на стеке уничтожаются в естественном (обратном) порядке.
  18. 20/35 20/35 Stack unwinding 3/5 • При возникновении исключения объекты

    на стеке уничтожаются в естественном (обратном) порядке.
  19. 21/35 21/35 Stack unwinding 4/5 • При возникновении исключения объекты

    на стеке уничтожаются в естественном (обратном) порядке.
  20. 22/35 22/35 Stack unwinding 4/5 • При возникновении исключения объекты

    на стеке уничтожаются в естественном (обратном) порядке. • Чтобы это реализовать, немного теряется эффективность программы • Какие ещё проблемы?
  21. 24/35 24/35 Стандартные классы исключений Стандартные классы ошибок: • logic_error:

    domain_error, invalid_argument, length_error, out_of_range • runtime_error: range_error, overflow_error, underflow_error
  22. 25/35 25/35 Исключения в стандартной библиотеке • Метод at контейнеров

    array, vector, deque, basic_string, bitset, map, unordered_map бросает out_of_range. • Оператор new T бросает bad_alloc. • Оператор typeid от разыменованного нулевого указателя бросает bad_typeid. • Потоки ввода-вывода.
  23. 26/35 26/35 Когда использовать исключения? 1/2 Правила хорошего тона: •

    Разделять ошибки программиста и исключительные ситуации • Использовать assert • Использовать только стандартные классы исключений или производные от них • Бросать по значению, отлавливать по ссылке. Почему? • Отлавливайте все исключения в точке входа
  24. 27/35 27/35 Когда использовать исключения? 2/2 Когда применяются исключения: •

    Обрабатываемая ошибка просходит нечасто. • Ошибка серьёзная,и без её обработки невозможно дальнейшее исполнение программы. • Ошибка не может быть обработана там, где она возникла. • Нет более подходящего способа вернуть код ошибки.
  25. 28/35 28/35 Конструкторы Исключение – это единственный способ прервать конструирование

    объекта и сообщить об ошибке. • Исключения, которые вылетают из конструктора, корректно обрабатываются. При исключении в конструкторе не будет вызван деструктор, потому что деструктор вызывается, если объект уже создан.
  26. 32/35 32/35 Деструктор и без блока try-catch? 1. throw std::runtime_error("Some

    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(); }
  27. 33/35 33/35 Деструктор и без блока try-catch? 1. throw std::runtime_error("Some

    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(); }
  28. 34/35 34/35 Материалы Основные источники: • Курс "Программирование на языке

    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/