УП № 17 Обработка исключительных ситуаций2017


Основы обработки исключений
Обработка исключений в С++ использует три ключевых слова: try, catch и throw. Те инструкции программы, где ожидается возможность появления исключительных ситуаций, содержатся в блоке try. Если в блоке try возникает исключение, т. е. ошибка, то генерируется исключение. Исключение перехватывается, используя catch, и обрабатывается. Ниже это общее описание будет рассмотрено более подробно.
Инструкция, генерирующая исключение, должна исполняться внутри блока try. Вызванные из блока try функции также могут генерировать исключения. Всякое исключение должно быть перехвачено инструкцией catch, которая непосредственно следует за инструкцией try, сгенерировавшей исключение. Общая форма блоков try и catch показана ниже:
try {// блок trycatch (тип1 аргумент) {// блок catchcatch (тип2 аргумент) {// блок catchcatch (типЗ аргумент) {// блок catch}...catch (типN аргумент) {// блок catch}
Размеры блока try могут изменяться в больших пределах. Например, блок try может содержать несколько инструкций какой-либо функции, либо же, напротив, включать в себя весь код функции main(), так что вся программа будет охвачена обработкой исключений.
Когда исключение сгенерировано, оно перехватывается соответствующей инструкцией catch, обрабатывающей это исключение. Одному блоку try может отвечать несколько инструкций catch, Какая именно инструкция catch исполняется, зависит от типа исключения. Это означает, что если тип данных, указанных в инструкции catch, соответствует типу данных исключения, то только эта инструкция catch и будет исполнена. Когда исключение перехвачено, arg получает ее значение. Перехваченным может быть любой тип данных, включая созданные программистом классы. Если никакого исключения не сгенерировано, то есть никакой ошибки не возникло в блоке try, то инструкции catch выполняться не будут.
Общая форма записи инструкции throw имеет вид:
throw исключение;
Инструкция throw должна выполняться либо внутри блока try, либо в функции, вызванной из блока try. В записанном выше выражении исключение обозначает сгенерированное значение.
Если генерируется исключение, для которого отсутствует подходящая инструкция catch, может произойти аварийное завершение программы. При генерации необработанного исключениявызывается функция terminate(). По умолчанию terminate() вызывает функцию abort(), завершающую выполнение программы. Однако можно задать свою собственную обработку, используя функцию set_terminate(). Подробности можно найти в документации к компилятору.
Ниже представлен пример, иллюстрирующий способ обработки исключений в С++:// пример обработки простого исключения#include <iostream.h>int main(){cout << "Start\n";try { // начало блока trycout << "Inside try block\n";throw 100; // генерация ошибкиcout << "This will not execute";}catch (int i) { // перехват ошибкиcout << "Caught an exception -- value is: ";cout << i << " \n";}cout << "End";return 0;}
Программа выведет на экран следующий текст:StartInside try blockCaught an exception -- value is: 100End
Рассмотрим внимательнее эту программу. Как можно видеть, блок try содержит три инструкции. За ним следует инструкция catch(int i), обрабатывающая исключения целого типа. В блоке try будут выполняться только две инструкции: первая и вторая — throw. Как только исключение было сгенерировано, управление передается инструкции catch, а блок try прекращает свое исполнение. Таким образом, catch не вызывается. Скорее можно сказать, что к ней переходит исполнение программы. Для этого автоматически осуществляется переустановка стека. Таким образом, инструкция после инструкции throw никогда не выполняется.
Обычно код в инструкции catch пытается исправить ошибку путем выполнения подходящих действий. Если ошибку удалось исправить, то выполнение продолжается с инструкции, непосредственно следующей за catch. Однако иногда не удается справиться с ошибкой, и блок catch завершает программу путем вызова функции exit() или функции abort().
Как отмечалось, тип исключения должен соответствовать указанному в инструкции типу. Например, в предыдущем примере если изменить тип инструкции catch на double, то исключение не будет перехвачено и произойдет аварийное завершение программы. Такое изменение показано ниже:// данный пример не будет работать#include <iostream.h>int main(){cout << "Start\n";try { // начало блока trycout << "Inside try block\n";throw 100; // генерация ошибкиcout << "This will not execute";}catch (double i) { // не будет работать для целочисленного исключенияcout << "Caught an exception -- value is: ";cout << i << "\n";}cout << "End";return 0;}
Эта программа выдаст следующий результат, поскольку исключение целого типа не будет перехвачено инструкцией catch (double i):StartInside try blockAbnormal program termination
Исключение может также быть сгенерировано из функции, вызванной изнутри блока try. В качестве примера рассмотрим следующую программу:/* генерация исключения из функции, находящейся вне блока try*/#include <iostream.h>void Xtest(int test){cout << "Inside Xtest, test is: " << test << "\n";if (test) throw test;}int main(){cout << "Start\n";try { // начало блока trycout << "Inside try block\n";Xtest (0);Xtest (1);Xtest (2);}catch (int i) { // перехват ошибкиcout << "Caught an exception -- value is: ";cout << i << "\n";}cout << "End";return 0;}
Эта программа выдаст следующий результат:StartInside try blockInside Xtest, test is: 0Inside Xtest, test is: 1Caught an exception -- value is: 1End
Блок try может быть локализован в какой-то функции. В таком случае всякий раз при входе в функцию начинается обработка исключений. В качестве примера рассмотрим следующую программу:#include <iostream.h>// try/catch могут находиться в функции вне main()void Xhandler(int test){try {if (test) throw test;}catch(int i) {cout << "Caught Exception #: " << i << '\n';}}int main(){cout << "Start\n";Xhandler(1);Xhandler(2);Xhandler(0);Xhandler(3);cout << "End";return 0;}
Эта программа выдаст на экран следующий текст:StartCaught Exception #: 1Caught Exception #: 2Caught Exception #: 3End
Как видно, сгенерировано три исключения. После каждого исключения функция возвращает управление в функцию main. При каждом новом вызове функции возвращается обработка исключений.
Важно понимать, что код, ассоциированный с инструкцией catch, будет исполняться только тогда, когда перехвачено исключение. В противном случае выполнение программы просто обойдет инструкцию catch.
Вариант 1.
Задание №1.
Создайте динамический массив (vector) размерностью 10 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,2} соответственно, новый массив не должен содержать одинаковых чисел. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 2.
Задание №1.
Создайте динамический массив (vector) размерностью 12 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,3} соответственно, новый массив не должен содержать четных чисел. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не учитывает). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 3.
Задание №1.
Создайте динамический массив (vector) размерностью 15 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,4} соответственно, новый массив не должен содержать нечетных чисел. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0 и, если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя. Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 4.
Задание №1.
Создайте динамический массив (vector) размерностью 17 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,5} соответственно, новый массив не должен содержать целых чисел. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 5.
Задание №1.
Создайте динамический массив (vector) размерностью 20 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,6} соответственно, новый массив не должен содержать дробных чисел. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 6.
Задание №1.
Создайте динамический массив (vector) размерностью 25 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,7} соответственно, новый массив не должен содержать чисел больше 10. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не учитывает). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 7.
Задание №1.
Создайте динамический массив (vector) размерностью 30 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,8} соответственно, новый массив не должен содержать чисел меньше 10. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя. Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 8.
Задание №1.
Создайте динамический массив (vector) размерностью 17 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,9} соответственно, новый массив не должен содержать чисел, делящихся на 3. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 9.
Задание №1.
Создайте динамический массив (vector) размерностью 20 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,2} соответственно, новый массив не должен содержать чисел, делящихся на 9. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 10.
Задание №1.
Создайте динамический массив (vector) размерностью 25 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,3} соответственно, новый массив не должен содержать чисел, делящихся на 5. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя (нули программа не учитывает). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 11.
Задание №1.
Создайте динамический массив (vector) размерностью 30 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,4} соответственно, новый массив не должен содержать чисел, делящихся на 10. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя. Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 12.
Задание №1.
Создайте динамический массив (vector) размерностью 25 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,5} соответственно, новый массив не должен содержать чисел, делящихся на 11. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическо полученного вектора с использованием указателя (нули программа не суммирует). Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.
Вариант 13.
Задание №1.
Создайте динамический массив (vector) размерностью 30 элементов и заполните его случайным образом числами от 1 до 99 в десятичном формате. Создайте новый массив vector2, разделив элементы массива на {1,0,6} соответственно, новый массив не должен содержать чисел-палиндромов. Выведите исходный и полученный массив на экран и в файл в несколько форматированных столбцов. Обработайте исключения при делении на 0, и если файл не открывается.
Задание №2.
Найти среднее арифметическое полученного вектора с использованием указателя. Данные вводить из файла. Осуществить контроль входных данных, используя обработку исключительных ситуаций.

Приложенные файлы

  • docx 15910555
    Размер файла: 51 kB Загрузок: 1

Добавить комментарий