Шаг 21.
Microsoft Visual C++ 2010. Начала.
Первый проект. Обработка исключения

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

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

    В простейшем случае инструкция обработки исключения в общем виде выглядит так:

  try
  {
    // Здесь инструкции, выполнение которых
    // может вызвать исключение
  }
  catch (ТипИсключения^ e)
  {
    // Здесь инструкции обработки исключения
  }

    Ключевое слово try указывает, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа. Слово catch обозначает начало секции обработки исключений. После слова catch указывается ссылка на тип исключения, обработку которого берет на себя программа. Далее следуют инструкции, обеспечивающие обработку исключения. Нужно обратить внимание на то, что инструкции секции try, следующие за той, при выполнении которой возникло исключение, после обработки исключения не выполняются.

    В таблице 1 перечислены часто возникающие исключения и указаны причины, которые могут привести к их возникновению.

Таблица 1. Типичные исключения
Исключение Возникает
FormatException - ошибка формата (преобразования) При выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому типу. Наиболее часто возникает при преобразовании строки символов в число
IndexOutOfRangeException - выход значения индекса за допустимые границы При обращении к несуществующему элементу массива
ArgumentOutOfRangeException - выход значения аргумента за допустимые границы При обращении к несуществующему элементу данных, например, при выполнении операций со строками
OverflowException - переполнение Если результат выполнения операции выходит за границы допустимого диапазона, а также при выполнении операции деления, если делитель равен нулю

    В качестве примера обработки исключения в листинге ниже приведена функция обработки события Click, возникающего при щелчке на кнопке Расчет окна программы "Доход". При возникновении исключения FormatException программа определяет причину (какое из полей незаполнено или содержит неверные данные) и выводит соответствующее сообщение (рисунок 1).

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	double sum; // сумма
	int period; // срок
	double percent; // процентная ставка
	double profit; // доход

	sum = 0;
	period = 0;
	try
	{
		sum = System::Convert::ToDouble(textBox1->Text);
		period = System::Convert::ToInt32(textBox2->Text);
		if (sum < 10000)
			percent = 8.5;
		else
			percent = 12;
		profit = sum * (percent/100/12) * period;
		label3->Text =
			"Процентная ставка: " + percent.ToString("n") + "%\n" +
			"Доход:" + profit.ToString("c");
	}
	catch (System::FormatException^ e)
	{
		if (sum == 0)
		{
			MessageBox::Show("Ошибка в исходных данных. \n
                                В поле Сумма надо ввести число.",
				"Доход",
				MessageBoxButtons::OK,
				MessageBoxIcon::Warning);
			textBox1->Focus();
		}
		else
		{
			MessageBox::Show("Ошибка в исходных данных. \n
                                В поле Срок надо ввести целое число.",
				"Доход",
				MessageBoxButtons::OK,
				MessageBoxIcon::Warning);
				textBox2->Focus();
		}
	}
}
};
}
Архив проекта можно взять здесь.


Рис.1. Пример сообщения об ошибке

    В приведенной функции обработки события Click для вывода сообщения о неверных данных используется функция MessageBox::Show, инструкция вызова которой в общем виде выглядит так:

 r = MessageBox::Show(Сообщение, Заголовок, Кнопки, 
         ТипСообщения, КнопкаПоУмолчанию) 
где:

    Значение (тип System::Windows::Forms::DialogResult), возвращаемое функцией MessageBox::Show, позволяет определить, какая кнопка была нажата пользователем для завершения диалога (таблица 5). Если в окне сообщения отображается одна кнопка (очевидно, что в этом случае не нужно проверять, какую кнопку нажал пользователь), то функцию MessageBox::Show можно вызвать как процедуру.

Таблица 2. Идентификаторы кнопок
Значение параметра Кнопки, отображаемые в окне сообщения
MessageBoxButtons::OK OK
MessageBoxButtons::YesNo Yes, No (Да, Нет)
MessageBoxButtons::YesNoCancel Yes, No, Cancel (Да, Нет, Отменить)

Таблица 3. Тип сообщения
Сообщение Тип сообщения Значок
Warning - Внимание MessageBoxIcon::Warning
Error - Ошибка MessageBoxIcon::Error
Information - Информация MessageBoxIcon::Information

Таблица 4. Активная кнопка
Значение параметра Номер активной кнопки
System::Windows::Forms::MessageBoxDefaultButton::Button1 1
System::Windows::Forms::MessageBoxDefaultButton::Button2 2
System::Windows::Forms::MessageBoxDefaultButton::Button3 3

Таблица 5. Значения функции MessageBox::Show
Значение Нажата кнопка
System::Windows::Forms::DialogResult::Yes Yes (Да)
System::Windows::Forms::DialogResult::No No (Нет)
System::Windows::Forms::DialogResult::Cancel Cancel (Отмена)

    На следующем шаге мы рассмотрим внесение изменений.




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