Шаг 208.
Microsoft Visual C++ 2010. Язык С/С++.
Управление исключительными ситуациями. Пример 2

    На этом шаге мы рассмотрим еще один пример обработки исключений.

    В этом примере мы покажем, как использовать класс, задающий определенный тип исключения. Для этого воспользуемся классом из таблицы предыдущего шага - классом обработки исключительных ситуаций, возникающих при попытке деления на нуль - классом DivideByZeroException.

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

// 207_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;
		// =================================
		// === Начало добавления ==========
		try {
			int i = 7 % atoi(buf);
			Console::WriteLine("Остаток от деления 7 на {0} = {1}\n", 
                              atoi(buf), i);
		}
		catch (DivideByZeroException^ x)
		{
			Console::WriteLine("Ошибка: {0}", x->ToString());
			Console::WriteLine("\nНекоторые части:");
			Console::WriteLine("Сообщение: {0}", x->Message);
			Console::WriteLine("Имя приложения: {0}",x->Source);
			Console::WriteLine("Место возникновения: {0}",x->StackTrace);
		}
		// === Конец добавления ==========
		delete[] buf;
	}
	catch (...)   //обработчик исключения любого типа
	{
		Console::WriteLine("Исключение!\n");
	}
	Console::ReadLine();  //Задержка экрана
}
Архив проекта можно взять здесь.

    На рисунках 1-3 показана работа приложения при различных входных данных.


Рис.1. Данные введены корректно, исключение не возникает


Рис.2. Задана слишком большая строка, сработало "внешнее" исключение, обрабатывающее исключения любых типов


Рис.3. Задана строка, не содержащее число. Сработало "внутреннее" исключение, обрабатывающее деление на нуль

    Прокомментируем полученный результат.

    "Внутреннее" исключение, добавленное в программу, обрабатывает возникновение ошибочной ситуации, связанной нахождением остатка от деления. В частности, функция atoi() возвращает значение 0, если начальные символы строки нельзя интерпретировать как число (рисунок 3). В такой ситуации найти остаток от деления не представляется возможным, что ведет к появлению исключительной ситуации.

    Эта ситуация будет обработана конструкцией catch() с аргументом DivideByZeroException^ x. Здесь конструкция DivideByZeroException определяет тип обрабатываемого исключения, а параметр x содержит дополнительные данные, которые могут использоваться при обработке исключения. В примере на рисунке 3 некоторые из значений этих параметров представлены, а также выведено на экран полное значение параметра x.

    Отметим, что если не требуется использовать в обработчике дополнительные параметры, то имя параметра можно опустить. Таким образом конструкция catch() в этом случае могла бы выглядеть так:

  catch (DivideByZeroException^)

    Дополнительную информацию по обработке исключений можно получить здесь (шаги 1 - 7).

    На следующем шаге мы рассмотрим особенности обработки исключений при создании приложений Windows Forms.




Предыдущий шаг Содержание Следующий шаг