В программе
В разработанной программе мы не учли возможные ошибки ввода данных. Во-первых, пользователь может ввести последовательность символов, которая не является числом. Во-вторых, пользователь может ввести значение коэффициента 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, и вы увидите работу определенного вами обработчика исключения. Однако после того, как вы сделаете законченный проект, исключительные ситуации будут обрабатываться в соответствии с кодом вашей программы.