Лекция 17 - Исключения.ppt
- Количество слайдов: 20
Языки программирования Исключения Полежаев Петр Николаевич
Понятие исключения Исключение – это ошибка, возникающая во время выполнения программы. Примеры: ошибка обращения к недопустимой области памяти, деление на ноль, ошибки при работе с файлами. С++ дает программисту возможность реагировать на исключения и обрабатывать их, продолжая выполнение программы. Механизм исключений позволяет логически разделить вычислительный процесс на две части – обнаружение ошибки и ее обработку.
Принцип обработки исключений Функция, которая не может выполнить требуемое действие, генерирует исключение (throw). Исключение возникает где-то в контролируемом блоке (try), из которого вызывается эта функция. При этом отыскивается обработчик исключения (catch) и ему передается управление. Если обработчик не найден, то вызывается функция terminate, аварийно завершающая программу.
Контролируемый блок – код, внутри которого может генерироваться исключение. При этом также контролируются все вызываемые функции из данного кода. try { //контролируемые операторы } сatch (тип_1 имя_1) { //обработка исключения тип_1 } … catch(тип_n имя_n) { //обработка исключения тип_n } Контролируемый блок Обработчики исключений
Обработчик исключения (I) Каждый обработчик исключения начинается с ключевого слова catch, за которым в скобках указывается тип исключения. Можно записать один или несколько обработчиков в соответствии с типами обрабатываемых исключений. Все обработчики должны располагаться непосредственно после контролируемого блока try.
Обработчик исключения (II) Три формы записи обработчиков: catch(тип имя) { /*код обработчика*/ } Применяется, когда имя объекта исключения используется в обработчике для получении информации о нем. catch(тип) { /*код обработчика*/ } Применяется, когда важен тип исключения, но информация о нем не используется. catch(…) { /*код обработчика*/ } Применяется для обработки всех исключений Обработчики исключений просматриваются в том порядке, в котором они записаны и выбирается подходящий вариант. После выполнения обработчика управление передается первому оператору, следующему за обработчиками. Если в блоке try не было исключения, то управления тоже передается первому оператору, следующему за обработчиками.
Генерация исключения происходит в той части кода, которая обнаруживает ошибку. Формат: throw выражение; Тип выражения определяет тип порождаемого исключения. Обычно используют специальные классы, но также можно применять и стандартные типы данных. При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика, возможно с раскручиванием стека вызовов функций, если обработчик отсутствует на соответствующем уровне. При поиске обработчика исключения автоматически вызываются деструкторы локальных объектов. Как правило исключения генерируются не непосредственно в блоке try, а в функциях прямо или косвенно вызываемых из него.
Пример использования исключений в программе для вычисления 2^p, в случае если p не принадлежит отрезку [0; 31] (I) //Функция, вычисляющая 2 ^ p для p из диапазона [0; 31] unsigned int Power. Of. Two(int p){ if (p < 0)//если p отрицательно генерируем исключение типа int throw p; if (p > 31)//если больше 31 генерируем исключение типа double throw 2. 5; return 1 ul << p; //Вычисляем 2^p с помощью операции сдвига } int main() { int power; //степень unsigned int result; //результат cout << "Power : "; cin >> power; //Контролируемый блок try { cout << "Starting try-block" << endl; result = Power. Of. Two(power); cout << "2 ^ " << power << " = " << result << endl; cout << "Finishing try-block" << endl; }
Пример использования исключений в программе для вычисления 2^p, в случае если p не принадлежит отрезку [0; 31] (II) } catch(int) //обработчик исключения типа int { cout << "Power must be positive!" << endl; } catch (double d) //обработчик исключения типа double { cout << "Power must be <= 31!" << endl; } catch (. . . ) //обработчик всех исключений { cout << "Other exception!" << endl; } cout << "Done!" << endl; return 0;
Пример исключения открытия файла (использование стандартных типов в качестве типов исключений) (I) //Класс "привет" class Hello { public: Hello() { cout << "Hello" << endl; } ~Hello() { cout << "Bye" << endl; } }; //Фукнция f 1 пытается открыть несуществующий файл //и вызывает исключение void f 1(){ ifstream inp("invalid_file_name"); if (!inp) { //если открыть не удалось cout << "Generating exeption" << endl; //Генерируем исключение //throw 12; throw "File open exeption!!!"; //throw 2. 4; } } //Фукнция f 2 создает локальный объект h и вызывает функцию f 1 void f 2() { Hello h; f 1(); }
Пример исключения открытия файла (использование стандартных типов в качестве типов исключений) (II) int main() { //Контролируемый блок try { cout << "Starting try-block" << endl; f 2(); cout << "Finishing try-block" << endl; } catch (int i) //Обработчик исключения типа int { cout << "Exception int - " << i << endl; } catch (const char* s) //Обработчик исключения типа const char* { cout << "Exeption const char* " << s << endl; } catch (. . . ) //Обработчик всех исключений { cout << "Unknown exeption" << endl; } cout << "Exit" << endl; return 0; }
Совет В качестве типов исключений лучше использовать собственные классы, а не стандартные типы данных.
Пример использования исключений в шаблоне класса стека (I) const int MAX_SIZE = 4; //Размер стека template
Пример использования исключений в шаблоне класса стека (II) int main(){ //Инстанцирование шаблона класса стека для целочисленного типа Stack
Исключения с аргументами Если необходимо передать какие-нибудь данные от части кода, обнаружившего ошибка к коду, ее обрабатывающему, то лучше использовать исключения с аргументами (параметрами). Они представляют собой собственные классы, через поля которых передается необходимая информация.
Исключения с аргументами на примере шаблона класса стека (I) const int MAX_SIZE = 4; //Размер стека template
Исключения с аргументами на примере шаблона класса стека (II) int main() { //Инстанцирование шаблона класса стека для целочисленного типа Stack
Стандартные исключения Стандартная библиотек C++ содержит несколько стандартных классов исключений, являющимися потомками класса exception. Они описаны в заголовочном файле
Задание для самостоятельной работы • Самостоятельно более глубоко изучить главу 7 «Исключения» (см. Павловская "Программирование на языке высокого уровня", с. 222 – 230)
Вопросы? • Q&A