- •Раздел 2. Механизмы последовательного выполнения программ
- •2.1. Классификация методов замены контекста
- •2.2. Процедуры как синхронные методы замены контекста
- •2.3. Сопрограммы
- •2.4. Примеры реализации сопрограмм в Си, в защищенном режиме процессора и в Win32
- •2.4.1. Пример реализации сопрограмм в Си
- •2.4.2. Пример реализации сопрограмм в защищенном режиме
- •2.4.3. Пример реализации сопрограмм в Win32
- •2.5. Процедуры ос
- •2.6. Прерывания как асинхронный метод замены контекста
- •2.7. Исключения
- •2.7.1. Самая общая характеристика исключений
- •2.7.2 Исключения на низком уровне
- •2.7.3. Исключения в программных средах
- •2.7.4. Обработка исключений в Delphi
- •2.7.4.1. Защита ресурсов
- •2.7.4.2. Обработка исключений
2.7.4.2. Обработка исключений
Вопрос (
Для обработки исключений следует использовать второй вариант защищенного блока следующего вида:
try
Операторы, которые могут вызвать исключение;
except
Операторы обработки исключения;
end;
Приложение выполняет операторы в except части, только если исключение имеет место при выполнении операторов в try части. Когда оператор в try части возбуждает исключение, выполнение немедленно передается в except часть.
)Вопрос
В приведенном выше варианте в части except будут обрабатываться все исключения, даже те, на которые эта обработка не рассчитана. Поэтому в части except необходимо уточнить виды обрабатываемых исключений. Это делается следующим образом:
except
on <тип исключения> do <операторы>
end;
Рассмотрим пример процедуры с обработкой исключения:
function Division(Dlm, Dlt : Integer) : Integer;
begin
try
Result := Dlm div Dlt;
except
on EDivByZero do begin
Result := 0;
write('EDivByZero exception!');
end;
end;
end;
При обработке исключения в приведенном примере можно учесть, что EDivByZero - это тип исключения, а может существовать и экземпляр исключения. Эту особенность можно использовать для чтения полей объекта-исключения, например:
except
on E : EDivByZero do begin
Result := 0;
write(E.Message);
end;
end;
Здесь Е - временная переменная для хранения экземпляра исключения.
Еще раз напомним, что обрабатывать нужно только те исключения, которые вы хотите и знаете, как обрабатывать. Если блок не управляет некоторыми видами исключений, то при их возникновении управление передается во внешний блок с возбужденным исключением. Если и там нет обработчика, то процесс повторяется вплоть до уровня приложения. На уровне приложения выполнение аварийно завершается.
Заключение по разделу 2
Еще раз сопоставим все пять перечисленных методов замены контекста.
Процедуры - самый простой способ замены контекста на основе одного стека.
Сопрограммы - отличаются от процедур наличием собственных стеков каждая.
Процедуры ОС выполняют еще более глубокую замену контекста с включением проверки прав пользователя на этот вызов.
Прерывания - это асинхронный способ замены контекста, обусловленный внешней по отношению к процессору причиной, с необязательным возвратом в прерванную программу.
Исключения - это также асинхронный способ замены контекста, но обусловленный внутренними причинами - ошибками в ходе выполнения операций программы.
