(Проектирование графического интерфейса пользователя______________315

зователя о возникшей проблеме и подсказать ему пути ее решения, принять ка-
кие-то меры к исправлению ошибки (например, при переполнении заслать в резу-
льтат очень большое число соответствующего знака) и т.д. Наиболее ценным явля-
^L ется то, что вы можете определить тип сгенерированного исключения и дифферен-
^и цированно реагировать на различные исключительные ситуации. Причем пере-
^Ш хват исключения блоком catch приводит к тому, что это исключение далее не обра-
^В батывается стандартным образом, т.е. пользователю не предъявляется окно с непо-
^Н нятными ему английскими текстами.
^В     Полная таблица классов исключений приводится в справочной части книги в
^В главе 15. А пока ограничимся краткой таблицей наиболее часто встречающихся
^Ш классов исключений (см. табл. 4.6).

^В                           Таблица 4.6. Некоторые классы исключений

^Ш EDivByZero           Попытка целочисленного деления на нуль
^к EIntOverflow          Переполнение при целочисленных операциях
^1 EZeroDivide           Деление на нуль
^К EOverflow             Переполнение в операции с плавающей запятой

'^к EOutOfMemory        He хватает места при динамическом распределении
^f                       памяти

^В EConvertError         Ошибки преобразования в StrToInt, StrTo Float и др.

^В    Приведем пример обработки исключений. Пусть в вашем приложении имеет-
^•i ся два окна редактирования Editi и Edit2, в которых пользователь вводит действи-
^R тельные числа типа float. Приложение должно разделить их одно на другое. При
^J этом возможен ряд ошибок: пользователь может ввести в окно символы, не преоб-
^^R разуемые в целое число, может ввести слишком большое число, может ввести вме-
^ШЕ сто делителя нуль, результат деления может быть слишком большим для типа flo-
^J at. Следующий код отлавливает все эти ошибки:

^^И    А = StrToFloat(Editl->Text) / StrToFloat(Edit2->Text) ;

^^B    catch(EConvertError&l

^^K     Application->MessageBox("Вы ввели ошибочное число",
^^1|                            "Повторите ввод",МВ_ОК) ;

^^^в   catch(EZeroDivides)

^^К    Application->MessageBox("Вы ввели нуль",
^^И                            "Повторите ввод",МВ_ОК) ;

^^R   catch(EOverflows)

^^^В    Application->MessageBox("Переполнение",
^^J                            "Ошибка вычислений",МВ_ОК) ;

^^В    if (StrToFloat(Editl->Text) * StrToFloat(Edit2->Text) >= 0)

^R    else A = -3.4E38;