Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Лекция 7

Только при возврате из функции обрабатываются объекты, помещенные в стек лишь этой функции. Оператор throw обрабатывает освобождение элементы, помещенных в стек всей цепочкой вызова функций между этим оператором throw и созданным исключением. Если раскручивание стека не происходило бы при вызове оператора throw, то деструкторы автоматических объектов, помещенных в стек между вызовами функций, были бы не вызваны.

Когда компилятор генерирует исключение, он всегда создает временную копию этого исключения, даже если в блоке catch{} отлавливается ссылка. Обычно, ссылочные типы возвращаются для экономии памяти. Однако, ссылка на базовый класс также может ссылаться на любой объект любого производного класса. Если существует иерархия типов исключений, то блок catch{}, содержащий ссылку на базовый класс, сможет обработать исключение любого производного типа.

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

Класс Exception

Главная цель введения исключений в языке С++ - это создание средства обработки ошибок на уровне языка.

В заголовке <stdexcept> определены базовые классы исключений: logic_error и runtime_error.

Семейство logic_error описывает логические ошибки, возникающие в коде. Например, если написать функцию, которая передает аргумент в другую функцию, и этот аргумент будет находится вне области определения этой функции, то будет сгенерирована ошибка из семейства logic_error, которая называется domain_error.

Исключение invalid_argument типа говорит о том, что функции было передано непредвиденное значение. Например, если функция ожидает получить строчку, состоящую только из символов 1 и 0, то данный тип исключения может быть сгенерирован при наличие других символов.

Исключение length_error используется, если недостаточно памяти. Например, класс string содержит метод append() ,генерирующий исключение length_error, если результирующая строка длиннее допустимой величины.

Исключение out_of_range служит для обозначения ошибок индексации. Например при перегрузке оператора [] можно сгенерировать исключение out_of_range, если переданный индекс недопустимого диапазона

Семейство runtime_error предназначено для обработки исключительных ситуация, возникающих во время выполнения программы.

Исключение типа underflow_error(потеря значимости) возникает тогда, когда результирующее значение типа с плавающей точкой меньше не нулевоц положтьельной величины .

Ошибка типа overflow_error возникает для результата, значение которого превышает максимально возможное.

Если результат вычисления лежит вне допустимого диапазона используемого типа, без потери значимости или переполнения, в этом случае можно использовать исключение типа range_error.

Исключение типа bad_alloc возникает в текущей версии С++, если вызов оператора new завершился неудачей. Ранее оператор new мог возвращать указатель нулевой при неуспешном выделении памяти. Для того, чтобы сообщить о необходимости возврата нулевого указателя в место создания исключения, можно использовать ключевое слово nothrow.

Тема 3. Потоки ввода/вывода в С++

Язык С и С++ не имеет операторов ввода/вывода, встроенных в сам язык. Язык С предоставил реализацию ввода/вывода создателям компилятора для того, чтобы позволить проектировать функции ввода/вывода в соответствии с требованиями целевой аудитории. Для организации ввода/вывода языка С++ не использовано решение языка С, а собрано собственная схема класса, реализованная в заголовочных файлах <iostream> и <fstream>.

Библиотека классов ввода/вывода языка С++ определяет набор стандартных конструкций, которые должны быть использованы для реализации ввода вывода.

Программа на языке С воспринимает любой ввод и вывод как потоки байт. При вводе программа

извлекает байт из входного потока в объекты переменные программы. А при выводе - из переменных в выходной поток.

Для текстовых программ каждый байт может представлять собой символ. Байты входного потока могут поступать из клавиатуры жесткого диска другого приложения, сокета. Байты выходного потока могут передаваться на дисплей, принтер, устройство хранения или другой программе.

31 мар 2021