На этом шаге мы рассмотрим простейший пример использования обработчика прерывания.
В этом примере обнаруживается ошибка превышения длины вводимой с клавиатуры строки: для ее размещения выделено всего 10 байтов, а мы вводим более 10 байтов. Хотя функция getline() контролирует количество вводимых символов с помощью своего 2-го параметра lim, но он задан большим, чем 10, и поэтому этот контроль не срабатывает. Создадим консольную программу, текст которой приведен ниже, результат работы программы показан на рисунке 1.
// 206_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> //for getchar(),putchar() #include <conio.h> //for getch() #include <stdlib.h> //atoi(),atof() #define eof -1 //Ctrl+z #define MAXLINE 1000 using namespace System; // Функция getline(s, lim) вводит с клавиатуры // строку в s и возвращает длину введенной строки // с учетом символа '\0'; // lim - максимальное количество символов, // которое можно ввести в строку s int getline(char s[], int lim) throw(...) // Внутри функции могут возникать любые исключения: // еще один вариант задания выброски исключения. { int c, i; for(i = 0; i < lim - 1 && (c=getchar()) != eof && c != '\n'; i++) s[i] = c; s[i] = '\0'; i++; //для учета количества return i; } void main() { try { //отвели место для строки из 10 символов char *buf = new char[10]; int rez = getline(buf, 200); //"ошиблись": максимальная длина строки задана //в 200 символов //этот оператор выбросит исключение, //если условие будет истинным if (rez >= 10) throw 1; delete[] buf; } catch (...) //обработчик исключения любого типа { Console::WriteLine("Исключение!"); } Console::ReadLine(); //Задержка экрана }
Рис.1. Обработка любой исключительной ситуации (здесь набрано более 10 символов)
На следующем шаге мы рассмотрим основные классы исключений.