|
Программирование >> Элементы языков с и с++
Пример 1 в этом примере обнаруживается ошибка превышения длины вводимой с клавиатуры строки: для ее размещения выделено всего 10 байтов, а мы вводим более 10 байтов. Хотя функция getiine о контролирует количество вводимых символов с помощью своего 2-го параметра lim, но он задан большим, чем 10, и поэтому этот контроль не срабатывает. Создадим с1г-копсольную программу, текст которой приведен в листинге 13.1, результат работы программы показан на рис. 13.1. Листинг 13.1 2008-Exception 2.срр : main project file, t.nclude stdafx.h Необязательный операнд (выражение) в throw имеет смысл операнда в операторе return: тоже нечто возвращает. Более детально процесс обработки исключительной ситуации состоит в следующем: D система исполняет операторы программы в обычном режиме, не обращая внимания на наличие операторов обработки исключительны.ч ситуаций; 3 как только в момент исполнения участка программы в теле try возникает исключительная ситуация, из выражения, находящегося в операторе throw (т. е. выражение в этом операторе должно всегда присутствовать), создается объект класса Exceptions (просто вызывается конструктор этого класса) и тут же отыскивается наивысший по иерархии оператор catch, который может обработать исключение возникшего типа (или любого типа). Если подходящего по возникшему типу исключения оператора catch не находится, то отыскивается ближайший следующий try-блок (как вы уже, наверно, догадались, try-блоков может быть много, потом> что исключительные ситуации могут возникать в различных участках вашей программы и каждый из таких подозрительных участков надо схватить try-блоком). Этот процесс продолжается, пока самый крайний ti-y-блок не проверится; D если все же подходящий try-блок не будет обнарумсен или в момент такого поиска возникнет новое исключение, вызывается специальная функция среды, которая завершает выполнение приложения. Если же подходящий try-блок найдется, то начнется обработка исключения соответствующим оператором catch. ttdefine eof -1 Ctrl+z ttdefine maxline 1000 /* Функция getline(s,lim) вводит с клавиатуры строку в s и возвращает длину введенной строки с учетом символа \0; lim - максимальное количество символов, которое можно ввести в строку s*/ int getline(char s[],int lim) throw (...) /* Внутри функции могут возникать любые исключения: еще один вариант задания выброски исключения. */ int c,i; for(i=0; i<lim-l && (c=getchar()) != eof && с != \n; i++) s[i]=c; s[i]=\0; i++; для учета количества return(i); } - . ------------------------------------------- int mainO /*заметьте, что имя главной функции в этом режиме не совпадает с именем главной функции в обычном режиме*/ char *buf; try using namespace System; ttinclude stdafx.h ttinclude <stdio.h> for getchar(),putchar() ttinclude <conio.h> for getch() ttinclude <stdlib.h> atoi(),atof() buf = new char[10]; отвели место для строки из 10 символов getiine(buf,200); ошиблись : макс, длина строки задана в 200 символов throw 1; этот оператор выбросит исключение, если оно возникнет catch (...) обработчик исключения любого типа { Console::WriteLine(Ь Исключение! ); } C:\WINDOWS\system32Vcmd.exe 123456789 IS Исключение! Цля продолжения нажмите любую клавишу Рис. 13.1. Обработка любой исключительной ситуации Пример 2 Этот пример развивает обработку исключительных ситуаций. Дополним предыдущую программу обработкой введенных символов. В частности, зададим оператор перевода 1-го символа введенной строки в число. Если этот символ будет буквой, должна возникнуть исключительная ситуация. Чтобы отловить это исключение, надо новый оператор поместить в свой блок try, для которого определить свой блок catch (получаем вложенность блоков обработки исключений). Текст программы показан в листинге 13.2, а результат- на рис. 13.2. Здесь (для разнообразия) создадим консольную программу в обычном (не в cir) режиме. 1ИСТИНГ 13.2 2008-Exception i.cpp : Defines the entry point for the console application.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |