Шаг 103.
Microsoft Visual C++ 2010. Начала.
Отладка программы. Предотвращение и обработка ошибок

    На этом шаге мы рассмотрим конструкции, используемые для обработки ошибок.

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

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

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

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

    Здесь:

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

.   .   .   .
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// чтение данных из файла в массив
	System::IO::StreamReader^ sr; // поток для чтения
	try
	{
		sr = gcnew System::IO::StreamReader(Application::StartupPath + 
                   "\\usd.dat");
		// создаем массив
		d = gcnew array<double>(10);
		// читаем данные из файла
		int i = 0;
		String^ t = sr->ReadLine();
		while ((t != String::Empty) && (i < d->Length))
		{
			// записываем считанное число в массив
			d[i++] = Convert::ToDouble(t);
			t = sr->ReadLine();
		}
		// закрываем поток
		sr->Close();
		// определить минимальное и максимальное значения ряда
		min = d[0];
		max = d[0];
		for (int i = 1; i < d->Length; i++)
		{
			if (d[i] > max) max = d[i];
			if (d[i] < min) min = d[i];
		}
		// Данные загружены.
		// Задаем функцию обработки события Paint
		this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this,
			&Form1::drawDiagram);
	}
	// Обработка исключений: 
	// нет файла данных 
	catch (System::IO::FileNotFoundException^ ex) 
	{
		MessageBox::Show("Нет файла данных.\n"+ ex->Message + "\n", 
			"График", 
			MessageBoxButtons::OK, 
			MessageBoxIcon::Error); 
	}
	// неверный формат данных 
	catch (System::FormatException^ ex) 
	{
		MessageBox::Show("Неверный формат данных.\n" + ex->Message, 
			"График", 
			MessageBoxButtons::OK, 
			MessageBoxIcon::Error); 
	}
}
.  .  .  .
Полный архив проекта можно взять здесь.

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

Таблица 1. Типичные исключения
Тип исключения Исключение, причина
System::FormatException Ошибка формата. Возникает при выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому виду. Наиболее часто возникает при попытке преобразовать строку символов в число, если строка содержит неверные символы. Например, при преобразовании строки в дробное значение, если в качестве десятичного разделителя вместо запятой (при стандартной для России настройке OC) поставлена точка
System::IndexOutOfRangeException Выход значения индекса за границу области допустимого значения. Возникает при обращении к несуществующему элементу массива
System::IO::FileNotFoundException Нет файла. Причина — отсутствие требуемого файла в указанном каталоге
System::IO::DirectoryFoundException Нет каталога. Причина — отсутствие требуемого каталога

    Другие исключения можно увидеть, выбрав в меню Debug (Отладка) команду Exceptions (Исключения) и в появившемся окне раскрыв соответствующую группу. В качестве примера на рисунке 1 приведены исключения, которые могут возникнуть при выполнении операций файлового ввода/вывода.


Рис.1. Список возможных исключений

    Более подробную информацию об программной обработке ошибок, особенностях ее организации можно получить здесь.

    Со следующего шага мы начнем рассматривать отладчик.




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