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

| Предупреждение ———————————————————————————————————

^^     Следует указать на некоторую опасность применения блока catch(...). Перехват всех исклю-
U     чений способен замаскировать какие-то непредвиденные ошибки в программе, что затруд-
^R     нит их поиск и снизит надежность работы.

^в   4.9.3.2 Последовательность обработки исключений, обработка
^В         на уровне приложения

^f    Блоки try...catch могут быть вложенными явным или неявным образом. При-
^J мером неявной вложенности является блок try...catch, в котором среди операторов
^Ш раздела try имеются вызовы функций или процедур, которые имеют свои собствен-
^В ные блоки try...catch. Рассмотрим последовательность обработки исключений в
^И этих случаях. При генерации исключения сначала ищется соответствующий ему
^К обработчик в том блоке try...catch, в котором создалась исключительная ситуация.
^К Если соответствующий обработчик не найден, поиск ведется в обрамляющем блоке
^Н| try...catch (при наличии явным образом вложенных блоков) и т.д. Если в данной
^В функции или процедуре обработчик не найден или вообще в ней отсутствуют бло-
^^В ки try...catch, то поиск переходит на следующий уровень — в блок, из которого
^И| была вызвана данная функция или процедура. Этот поиск продолжается по всем
^^Г уровням. И только если он закончился безрезультатно, выполняется стандартная
^И обработка исключения, заключающаяся, как уже было сказано, в выдаче пользо-
^И вателю сообщения о типе исключения.
^В    Как только блок catch, соответствующий данному исключению, найден и вы-
^Н| полнен, объект исключения разрушается и управление передается оператору, сле-
^^ дующему за соответствующим блоком try...catch.
^И    Возможен также вариант, когда в самом обработчике исключения в процессе
^К обработки возникла исключительная ситуация. В этом случае обработка прерыва-
^R ется, прежнее исключение разрушается и генерируется новое исключение. Его об-
^В работчик ищется в блоке try...catch, внешнем по отношению к тому, в котором
^R возникло новое исключение.

^^    Если исключение не перехвачено ни одним обработчиком в функциях, вы мо-
^f жете обработать его на уровне приложения. Для этого предусмотрены события
^Н| OnException компонента Application — самого приложения. Обработчик этих со-
^•| бытии можно ввести в ваше приложение следующим образом. Пусть вы решили
^Н| назвать этот обработчик MyException. Тогда в заголовочный файл приложения
^R надо добавить его объявление:

^^В    void _fastcall MyException(TObject *Sender, Exception *E) ;

^^Ш   В файл вашего модуля надо внести реализацию обработчика:

^^В    void _fastcall TFormI::MyException(TObject *Sender, Exception *E)

^^f      операторы обработки

^в    Осталось указать приложению на вашу функцию MyException как на обработ-
^_ чик события OnException. Вы можете это сделать, включив, например, в обработ-
^•| ку события формы OnCreate оператор:

^^f    Application->OnException = MyException;

^В    Ваш обработчик не перехваченных ранее исключений готов. Осталось только
^•1 наполнить его операторами, сообщающими пользователю о возникших неполад-
^^В ках и обеспечивающими дальнейшую работу программы. К вашей функции МуЕх-
^^В ception приложение будет обращаться, если было сгенерировано исключение и ни
^^В один блок catch его не перехватил. В функцию передается указатель Е на объект