В программе

В разработанной программе мы не учли возможные ошибки ввода данных. Во-первых, пользователь может ввести последовательность символов, которая не является числом. Во-вторых, пользователь может ввести значение коэффициента a = 0, что приведет к попытке деления на ноль в операторах, вычисляющих корни уравнения. Обе эти ситуации называются исключительными. Примерами других исключительных ситуаций являются переполнение, попытка открыть несуществующий файл и т.п. Для контроля за подобными ситуациями в системе C++ Builder существует так называемый механизм обработки исключительных ситуаций. При возникновении исключительной ситуации программа генерирует так называемое исключение и выполнение дальнейших вычислений в данном блоке прекращается. Исключение – это объект специального вида, характеризующий возникшую в программе исключительную ситуацию. Особенностью исключений является то, что это сугубо временные объекты. Как только они обрабатываются каким-либо обработчиком, они разрушаются. Если это исключение нигде не перехвачено в программе, то оно обрабатывается стандартным методом Tapplication.HandleException. Данный метод обеспечивает выдачу пользователю краткой информации в окне сообщений и уничтожение экземпляра исключения.

Наиболее кардинальный способ борьбы с исключениями – обработка их с помощью логических блоков try и catch:

try

{

//операторы, которые могут вызвать возникновение исключительной //ситуации

}

catch (Тип &e)

{

// команды, обрабатывающие данную исключительную ситуацию

}

Здесь Тип – это тип (класс) исключения.

В С++ Builder определен целый ряд классов исключений. Рассмотрим два из них, нужных в нашей программе: класс EConvertError, связанный c ошибкой преобразования строк или объектов (в частности, в функции StrToFloat), класс EZeroDivdide, связанный с попыткой деления на нуль числа с плавающей запятой.

Измените текст функции Button1Click в соответствии с приведенным ниже текстом.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float a,b,c,d,x1,x2;

try

{

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

c=StrToFloat(Edit3->Text);

}

catch(EConvertError &e)

{

ShowMessage("Ошибочные данные!");

return;

}

d=b*b-4*a*c;

if (d>=0)

{

try

{

x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a);

}

catch(EZeroDivide &e)

{

ShowMessage("Коэффициент а не может быть равен нулю!");

return;

}

Edit4->Text=FloatToStr(x1);

Edit5->Text=FloatToStr(x2);

}

else

ShowMessage("Действительных корней нет");

}

Сохраните изменения в тексте модуля и проверьте отсутствие ошибок.

!!! Если вы запустите проект на выполнение и зададите ошибочные данные, то отладчик перехватит исключительную ситуацию и выполнение программы прервется. Нажмите повторно кнопку Run, и вы увидите работу определенного вами обработчика исключения. Однако после того, как вы сделаете законченный проект, исключительные ситуации будут обрабатываться в соответствии с кодом вашей программы.