Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

3. Последовательность обработки исключений

При генерации исключения сначала ищется соответствующий ему обработчик on в том блоке try...except, в котором создалась исключительная ситуация. Если соответствующий обработчик не найден, поиск ведется в обрамляющем блоке try...except (при наличии явным образом вложенных блоков) и т.д. Если в данной функции или процедуре обработчик не найден или вообще в ней отсутствуют блоки try...except, то поиск переходит на следующий уровень — в блок, из которого была вызвана данная функция или процедура. Этот поиск продолжается по всем уровням. И только если он закончился безрезультатно, выпол­няется стандартная обработка исключения, заключающаяся, как уже было сказано, в выдаче пользователю сообщения о типе исключения.

Как только оператор on, соответствующий данному исключению, найден и выполнен, объект исключения разрушается и управление передается оператору, следующему за тем блоком try...except, в котором был осуществлен перехват.

4. Преднамеренная генерация исключений

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

Повторная генерация исключения осуществляется ключевым словом raise. Общая схема такой двухэтапной обработки исключений может иметь вид:

try

<операторы внешнего блока> try

<операторы, способные привести к генерации исключения> except

on <тип исключения> do begin

<обработка исключений,сгенерированных во внутреннем блоке>

raise; (повторная генерация исключения} end; end;

<операторы внешнего блока; при генерации исключения не выполняются> except on ESomething do

<обработка исключений и внутреннего, и внешнего блоков> end;

При такой организации программы исключения, сгенерированные во внутреннем блоке, обрабатываются в два этапа: сначала обработчиком внутреннего блока, а затем обработчиком внешнего блока.

С помощью ключевого слова raise можно сгенерировать не только повторное исключение, но и исключение любого типа в любом месте программы. Синтаксис оператора генерации исключения следующий:

raise <исключение>;

Вместо исключения можно указать тип исключения и один из его конструкторов.

Например, можно написать

raise <тип исключениям Create(<текст сообщения>);

В Delphi имеется исключение EAbort, несколько отличающееся от рассмотренных ранее. Генерация этого исключения, как и любых других, прерывает процесс вычисления. Но если приложение не отлавливает оператором on исключений этого класса, то они попадают в обработчик TAppIication.HandleException и там, в отличие от других исключений, разрушаются без всяких сообщений.

5. Сообщения Windows и их обработка

Большинство сообщений, которые вам могут потребоваться, Delphi обрабатывает сама, так что вам достаточно использовать обработчики стандартных событий компонентов. Но иногда вам может потребоваться самому обрабатывать сообщения Windows. Такая необходимость возникает, если нужное вам сообщение пока еще компонентами Delphi не обрабатывается, или если вы определили свое собственное сообщение.

Сообщения представляют собой структуру, содержащую поля. Обработка сообщения Windows происходит по цепочке:

событие => MainWndProc => WndProc => Dispatch => обработчик события

Для сообщений, обрабатываемых компонентами Delphi, вам достаточно написать свой обработчик события. Для сообщений, не предусмотренных в Delphi, вам надо вмешаться в эту цепочку раньше, перегрузив метод WndProc.

Если объект не имеет дескриптора, то цепочка остается той же, только сообщение получает оконный компонент, вмещающий данный объект.

В Windows API определен ряд функций, позволяющих послать сообщение. Это, прежде всего, функция SendMessage, которая посылает указанное в ней сообщение окну или множеству окон и не возвращается, пока это сообщение обрабатывается. Этим она отличается от похожей на нее функции PostMessage, которая возвращается сразу после передачи сообщения.

Объявление функции SendMessage:

function SendMessage(hWnd: HWnd; Msg, wParam: word; IParam.-Longlnt): Longlnt;

Параметр hWnd — дескриптор окна, которому передается сообщение. Параметр Msg определяет передаваемое сообщение. Параметры wParam и IParam могут содержать дополнительную информацию.

Контрольные вопросы:

  1. Для чего используется динамическое распределение памяти?

  2. Дайте определение исключению.

  3. Опишите последовательность обрботки исключений.

  4. Расскажите последовательность обработки сообщений Windows.

Рекомендуемая литература: 1.1, 1.3, 1.8.