История обновлений: №2
Время обновления: 21.10.2001, 02:42.
Обновлено: Musicwind®
Примечание по обновлению: измененный формат.
История обновлений: №1
Время обновления: 2001-10-19 21:15
Обновлено: Musicwind®
Примечания к обновлению: Создано.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Предисловие: Я знаком с Delphi уже более трех лет, но каждый раз, когда я читаю справочную документацию Delphi, я по-прежнему многое получаю, поэтому не могу не вздохнуть от того, насколько широк Delphi! Хотя мне стыдно, я разберу кое-что из своего опыта и достижений и поделюсь своей поддержкой с теми из вас, кто столь же высокомерен и менее осведомлен, как я.
1. Что такое молчаливое исключение? (Почему не «Молчание ягнят»? ;-) )
Тихие исключения, то есть Slient Exceptions , относятся к типу исключения, который по умолчанию не вызывает раздражающих сообщений: EAbort . В Object Pascal класс исключений EAbort является классом-предком всех классов молчаливых исключений (и EAbort наследует Exception). Вызов EAbort приведет к остановке модуля выполнения до тех пор, пока его не перехватит самый внешний модуль обработки исключений, но окно сообщения с красным знаком остановки не появится. Обратитесь к следующему коду:
пытаться
ShowMessage('Привет1');
Поднимите EAbort.Create('Прервать это');
ShowMessage('Привет2');
кроме
на E: Исключение сделать
showmessage('При исключении');
конец;
В результате выполнения отображаются два окна сообщений: одно «Hello1», а другое «При исключении». Это показывает, что EAbort работает, поскольку он пропускает оператор «ShowMessage('Hello2')» и в то же время не появляется окно сообщения «Прервать его», что также подтверждает особенность класса исключений EAbort, заключающуюся в отсутствии диалогового окна; (Это также верно во время проектирования); и окно сообщения «При исключении» указывает, что, хотя EAbort может быть аномалией, отличной от обычных исключений, это не мешает нам использовать старый оператор Try-Except для его перехвата. .
2. Зачем использовать EAbort ?
EAbort полезен в определенных ситуациях. Например, когда нам нужно завершить операцию, но мы не хотим, чтобы пользователи это заметили (мы не хотим, чтобы они видели окно сообщения об исключении по умолчанию). Конечно, для достижения того же эффекта можно использовать и обычные исключения (например, использовать шаблон предложения Try-Except, поместить код в секцию Try, вызвать исключение, если нужно завершить операцию, и не писать любой код в разделе «За исключением»), Но ничто из этого не является таким простым и прямым, как использование EAbort.
3. Есть ли что-нибудь проще? --Использование процесса прерывания
Abort, процесс, определенный в модуле SysUtils, позволяет нам удобно использовать EAbort. Просмотрите исходный код реализации Abort:
Прерывание процедуры;
функция ReturnAddr: Указатель;
Асм
ДВИЖЕНИЕ EAX,[EBP + 4]
конец;
начинать
поднять EAbort.Create(SOperationAborted) в ReturnAddr;
конец;
SOperationAborted здесь обычно означает «Операция прервана».
4. Приоткрыть завесу – принцип реализации
Возможно, вам, как и мне, интересно, почему EAbort молчит. Что Delphi сделала с EAbort внутри компании? Давайте выясним это вместе.
Откройте новый проект, нажмите «Найти в файлах», введите ключевое слово «EAbort», затем выберите переключатель «Искать в каталогах» и установите в поле редактирования «Маска файла» в «Параметры каталога поиска» имя каталога, в котором находится исходный код Delphi (например, как у меня Да: D:Program FilesBorlandDelphi6Source), и не забудьте поставить галочку Include SubDirectory. Наконец, нажмите «ОК», чтобы начать поиск.
В результате мы обнаружили, что в исходном коде Delphi есть целых 17 мест, имеющих отношение к EAbort. За исключением двух объявлений EAbort и некоторых комментариев в модуле Sysutils, мы обнаружили, что большая часть кода похожа на:
если ExceptObject — это EAbort, тогда
а также:
если нет (E — это EAbort), то
и т. д.
У всех них есть специальный подход к EAbort на основе RTTI — оказывается, реализация EAbort настолько проста!
Два модуля, заслуживающие внимания: Forms (версия для Linux — QForms) и AppEvnts. Ответ на вопрос легче найти в коде первого. См. исходный код Delphi:
процедура Tapplication.HandleException(Отправитель: TObject);
начинать
если GetCapture <> 0, то SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
если ExceptObject является исключением, тогда
начинать
если нет (ExceptObject — это EAbort), то
если назначено (FOnException), то
FOnException (Отправитель, Исключение (ExceptObject))
еще
ShowException(Exception(ExceptObject));
закончить еще
SysUtils.ShowException(ExceptObject, ExceptAddr);
конец;
5. Разница между Abort , Break и Exit
Abort, Break и Exit в чем-то похожи, но сильно отличаются. Break используется для выхода из цикла в операторе цикла. Выход используется для выхода из тела выполняющейся в данный момент функции (или тела процесса). Прерывание позволяет вам выйти из одного или нескольких слоев кода до тех пор, пока не появится код перехвата исключений.
6. Настройте тихие исключения
Точно так же, как и при объявлении подкласса обычного класса исключений, просто сделайте EAbort и его подклассы классами-предками:
TMyException = Класс (EAbort);
TNextException = Класс (EAbort);
и т. д.
Musicwind®@HangZhou.Zhejiang.China
20 октября 2001 г.
Еще статьи
[ Конец статьи]