Скачать презентацию Языки программирования Исключения Полежаев Петр Николаевич  Понятие Скачать презентацию Языки программирования Исключения Полежаев Петр Николаевич Понятие

Лекция 17 - Исключения.ppt

  • Количество слайдов: 20

Языки программирования Исключения Полежаев Петр Николаевич Языки программирования Исключения Полежаев Петр Николаевич

Понятие исключения Исключение – это ошибка, возникающая во время выполнения программы. Примеры: ошибка обращения Понятие исключения Исключение – это ошибка, возникающая во время выполнения программы. Примеры: ошибка обращения к недопустимой области памяти, деление на ноль, ошибки при работе с файлами. С++ дает программисту возможность реагировать на исключения и обрабатывать их, продолжая выполнение программы. Механизм исключений позволяет логически разделить вычислительный процесс на две части – обнаружение ошибки и ее обработку.

Принцип обработки исключений Функция, которая не может выполнить требуемое действие, генерирует исключение (throw). Исключение Принцип обработки исключений Функция, которая не может выполнить требуемое действие, генерирует исключение (throw). Исключение возникает где-то в контролируемом блоке (try), из которого вызывается эта функция. При этом отыскивается обработчик исключения (catch) и ему передается управление. Если обработчик не найден, то вызывается функция terminate, аварийно завершающая программу.

Контролируемый блок – код, внутри которого может генерироваться исключение. При этом также контролируются все Контролируемый блок – код, внутри которого может генерироваться исключение. При этом также контролируются все вызываемые функции из данного кода. try { //контролируемые операторы } сatch (тип_1 имя_1) { //обработка исключения тип_1 } … catch(тип_n имя_n) { //обработка исключения тип_n } Контролируемый блок Обработчики исключений

Обработчик исключения (I) Каждый обработчик исключения начинается с ключевого слова catch, за которым в Обработчик исключения (I) Каждый обработчик исключения начинается с ключевого слова catch, за которым в скобках указывается тип исключения. Можно записать один или несколько обработчиков в соответствии с типами обрабатываемых исключений. Все обработчики должны располагаться непосредственно после контролируемого блока try.

Обработчик исключения (II) Три формы записи обработчиков: catch(тип имя) { /*код обработчика*/ } Применяется, Обработчик исключения (II) Три формы записи обработчиков: catch(тип имя) { /*код обработчика*/ } Применяется, когда имя объекта исключения используется в обработчике для получении информации о нем. catch(тип) { /*код обработчика*/ } Применяется, когда важен тип исключения, но информация о нем не используется. catch(…) { /*код обработчика*/ } Применяется для обработки всех исключений Обработчики исключений просматриваются в том порядке, в котором они записаны и выбирается подходящий вариант. После выполнения обработчика управление передается первому оператору, следующему за обработчиками. Если в блоке try не было исключения, то управления тоже передается первому оператору, следующему за обработчиками.

Генерация исключения происходит в той части кода, которая обнаруживает ошибку. Формат: throw выражение; Тип Генерация исключения происходит в той части кода, которая обнаруживает ошибку. Формат: throw выражение; Тип выражения определяет тип порождаемого исключения. Обычно используют специальные классы, но также можно применять и стандартные типы данных. При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика, возможно с раскручиванием стека вызовов функций, если обработчик отсутствует на соответствующем уровне. При поиске обработчика исключения автоматически вызываются деструкторы локальных объектов. Как правило исключения генерируются не непосредственно в блоке try, а в функциях прямо или косвенно вызываемых из него.

Пример использования исключений в программе для вычисления 2^p, в случае если p не принадлежит Пример использования исключений в программе для вычисления 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 не принадлежит Пример использования исключений в программе для вычисления 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) //Класс Пример исключения открытия файла (использование стандартных типов в качестве типов исключений) (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() Пример исключения открытия файла (использование стандартных типов в качестве типов исключений) (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; //Размер Пример использования исключений в шаблоне класса стека (I) const int MAX_SIZE = 4; //Размер стека template //Шаблон класса стека class Stack { int top; T st[MAX_SIZE]; public: class Full. Exception{}; //Класс исключения переполнения стека class Empty. Exception{}; //Класс исключения пустоты стека Stack(): top(0) {} void Push(T value) { if (top == MAX_SIZE) throw Full. Exception(); st[top++] = value; } T Pop() { if (top == 0) throw Empty. Exception(); return st[--top]; } bool Empty() { return top == 0; } };

Пример использования исключений в шаблоне класса стека (II) int main(){ //Инстанцирование шаблона класса стека Пример использования исключений в шаблоне класса стека (II) int main(){ //Инстанцирование шаблона класса стека для целочисленного типа Stack st; try { st. Push(0); st. Push(1); st. Push(2); st. Push(3); //st. Push(4); // <-- раскомментировать для генерации исключения переполнения стека st. Pop(); //st. Pop(); // <-- раскомментироватья для генерации исключения пустоты стека } catch (Stack: : Full. Exception f) //обработчик исключения переполнения стека { cout << "Stack is full!" << endl; } catch (Stack: : Empty. Exception e) //обработчик исключения пустоты стека { cout << "Stack is empty!" << endl; } return 0;

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

Исключения с аргументами на примере шаблона класса стека (I) const int MAX_SIZE = 4; Исключения с аргументами на примере шаблона класса стека (I) const int MAX_SIZE = 4; //Размер стека template class Stack { int top; T st[MAX_SIZE]; public: class Exception { //Класс исключения с аргументами public: char Sender[30]; //Имя метода-источника исключения char Message[100]; //Сообщение Exception(char* sndr, char* msg) { strcpy(Sender, sndr); strcpy(Message, msg); } }; Stack(): top(0) {} void Push(T value){ if (top == MAX_SIZE) throw Exception("Push", "Full"); st[top++] = value; } T Pop() { if (top == 0) throw Exception("Pop", "Empty"); return st[--top]; } bool Empty() { return top == 0; } };

Исключения с аргументами на примере шаблона класса стека (II) int main() { //Инстанцирование шаблона Исключения с аргументами на примере шаблона класса стека (II) int main() { //Инстанцирование шаблона класса стека для целочисленного типа Stack st; try { st. Push(0); st. Push(1); st. Push(2); st. Push(3); //st. Push(4); // <-- раскомментировать для генерации исключения переполнения стека st. Pop(); //st. Pop(); // <-- раскомментировать для генерации исключения пустоты стека } catch (Stack: : Exception ex) //обработчик исключения c аргументами { cout << ex. Sender << " : " << ex. Message << endl; } return 0; }

Стандартные исключения Стандартная библиотек C++ содержит несколько стандартных классов исключений, являющимися потомками класса exception. Стандартные исключения Стандартная библиотек C++ содержит несколько стандартных классов исключений, являющимися потомками класса exception. Они описаны в заголовочном файле Примеры: out_of_range – исключение выхода за границу диапазона logic_error – исключение логической ошибки bad_alloc – исключение распределения памяти

Задание для самостоятельной работы • Самостоятельно более глубоко изучить главу 7 «Исключения» (см. Павловская Задание для самостоятельной работы • Самостоятельно более глубоко изучить главу 7 «Исключения» (см. Павловская "Программирование на языке высокого уровня", с. 222 – 230)

Вопросы? • Q&A Вопросы? • Q&A