Вы можете использовать команду TRY...CATCH...FINALLY как управляющую структуру, чтобы обрабатывать ошибки, или исключения, которые могут произойти в вашем коде в run time. Структура TRY...CATCH...FINALLY содержит блоки кода TRY , CATCH , и FINALLY так, что Вы можете определить инструкции, которые могли бы генерировать ошибки, инструкции, чтобы обработать эти ошибки, и инструкции, чтобы выполнить завершающие операции.
Структура TRY...CATCH...FINALLY начинается инструкцией TRY , которая отмечает начало блока TRY . В блоке TRY , Вы можете определить код, который мог бы вызвать ошибки в run time. Если ваша программа завершает блок TRY , не генерируя ошибки, или исключения, то он минует блок CATCH и переходит к блоку FINALLY в конце структуры, если он существует, и выполняет соответствующие инструкции. Если блока FINALLY не существует, выполнение программы продолжается за структурой, начиная с первой инструкции после инструкции ENDTRY , которая отмечает конец структуры TRY...CATCH...FINALLY .
![]() |
---|
Visual FoxPro разрешает существование структур TRY...CATCH...FINALLY , которые не имеют блоков CATCH и FINALLY , которые передают ошибку на высокоуровневый обработчик ошибок. |
Вы можете также вложить структуры TRY...CATCH...FINALLY в блоки TRY , CATCH , или FINALLY .
Следующие разделы описывают задания обработки ошибок, которые Вы можете исполнить в этих блоках кода:
- Генерирование Исключений
- Захват Исключений
- Передача Исключений на высокий уровень
- Немедленное прекращение команды TRY...CATCH...FINALLY
- Использование Команд в TRY...CATCH...FINALLY
- Выполнение инструкции FINALLY
Для подробной информации, см. TRY...CATCH...FINALLY Команда .
Генерирование Исключений
Visual FoxPro генерирует или "устраивает" исключение и создает объект Exception , который содержит подробности об ошибке, когда ошибка происходит в блоке TRY в следующих местах:
- Строка программы. Он включает вызовы внешних процедур, которые содержат ошибки, но не содержит собственных обработчиков ошибок.
- Обращение к объекту из метода, когда код метода содержит ошибки, а объект не содержит кода события Error .
Иначе, если код события Error существует, событие Error для этого объекта обрабатывает ошибку, если метод не содержит собственного обработчика ошибок TRY...CATCH...FINALLY .
![]() |
---|
Вы не можете выполнить код когда содан объект Exception . Созданный объект Exception , всегда существует как экземпляр базового класса Exception . Если Вы хотите использовать подкласс класса Exception , Вы должны повторно вызвать исключение в блоках CATCH или FINALLY . Только програмные файлы Visual FoxPro (.prg) поддерживают объекты Exception , хотя Вы можете вызвать исключения из форм, выполняющихся в среде проектирования. Вы не можете вызвать объекты Exception из COM объектов в файлах библиотек динамической компоновки (.dll) или исполняемых файлах (.exe). Для подробной информации, см. Exception Class . |
После того, как происходит ошибка, Visual FoxPro обрабатывает или "захватывает" исключение, переходя к первой инструкции CATCH , и ищет соответствующие инструкции в блоке CATCH , чтобы обработать исключение.
Захват исключения
Программа просматривает инструкции CATCH в порядке их появления в блоке CATCH , чтобы определить существующие инструкции для обработки исключения. Если программа находит инструкцию CATCH , которая обрабатывает исключение, программа, выполняет соответствующий код.
Инструкция CATCH может содержать дополнительные предложения TO и WHEN . Вы можете хранить ссылку на созданный объект Exception , определяя переменную памяти с использованием парметра VarName в предложении TO . Если Вы хотите задать условие для выполнения блока CATCH , Вы можете определить логическое выражение в предложении WHEN , которое должно быть приведено к Истине (.T). перед тем как инструкции блока CATCH будут выполняться. Инструкции CATCH работают подобно инструкциям CASE и предложение WHEN должно быть равно логическому выражению. Если опций TO и WHEN не существуют, инструкция CATCH рассматривается как CATCH WHEN .T. (Истина).
После того, как программа выполняет инструкции в блоке CATCH , она не возвращается к инструкции TRY , и она не ищет другой инструкции CATCH . Вместо этого, программа переходит непосредственно к инструкции FINALLY , если она существует, для выполнить любые других оставшихся инструкций. Иначе, программа завершает выполнение структуры TRY...CATCH...FINALLY и переходит к инструкции, которая немедленно следует за ENDTRY .
Эскалация исключений
Если Вы хотите передать или "повторно вызвать" исключение в обработчик ошибок более высокого уровня, Вы можете включить инструкцию THROW . Вы можете вызвать THROW из любого блока кода структуры TRY...CATCH...FINALLY. Тем не менее, Вы можете использовать THROW в любом месте кода, где существует обработчик ошибок для перехвата исключений. Вы не можете вызвать THROW из окна Command.
![]() |
---|
Вызов команды THROW вне структуры TRY...CATCH...FINALLY и без соответствующего обработчика ошибок заставляет вашу программу закончить выполнение. |
Если Вы используете THROW вне раздела TRY...CATCH , где вызванное исключение обработывается процедурой ON ERROR или системой Visual FoxPro вместо события Error , выполнение программы не возвращается в то место, где была вызвана инструкция THROW . Следующий пример показывает почему строка программы ?2
не выполняется. Это поведение отличается от традиционного поведения при обработке ошибок, когда выполнение программы возвращается к месту возникновения ошибки:
![]() | |
---|---|
ON ERROR ? ERROR() |
Помните что намеренный вызов THROW предназначен для передачи исключения обработчику ошибок более высокого уровня.
Если существует внешний блок TRY...CATCH рядом с инструкцией THROW , когда она вызывается изнутри блока CATCH или FINALLY , Visual FoxPro переназначает переменную памяти, указанную в предложении TO со ссылки к объекту предыдущего исключения на ссылку к объекту последнего исключения, созданного вызванным исключением. Если не существует никакой внешней структуры TRY...CATCH , Visual FoxPro передает исключение в процедуру ON ERROR или в событие ошибки, если они существуют. В противном случае, Visual FoxPro выводит соответствующее системное сообщение об ошибке.
Немедленный выход из TRY...CATCH...FINALLY
Вы можете выйти из блока кода немедленно включением инструкции EXIT в блоках TRY или CATCH . Программа продолжает выполнять код инструкции FINALLY , если он существуете, или переходит на строку, следующую сразу за инструкцией ENDTRY .
Использование Команд в TRY...CATCH...FINALLY
Вы можете использовать разные команды Visual FoxPro, которые влияют на нормальное выполнение кода изнутри блоков TRY или CATCH . Однако, если Вы используете одну из этих команд, которые не разрешаются для определенного блока, Visual FoxPro генерирует ошибку в run time. Инструкции FINALLY всегда выполняются перед обработкой этих команд, кроме случаев использования CANCEL или QUIT . Следующая таблица перечисляет команды Visual FoxPro, которые Вы можете и не может использовать в блоках TRY , CATCH , или FINALLY .
Команда | TRY | CATCH | FINALLY |
---|---|---|---|
CANCEL |
Да |
Да |
Да |
CLEAR ALL |
Да |
Нет |
Нет |
CLOSE ALL |
Да |
Да |
Да |
DOEVENTS |
Да |
Да |
Да |
ERROR |
Да |
Да |
Да |
EXIT |
Да |
Да |
Да |
LOOP |
Нет |
Нет |
Нет |
QUIT |
Да |
Да |
Да |
RELEASE |
Да |
Да |
Да |
RESUME |
Да |
Да |
Да |
RETRY |
Нет |
Нет |
Нет |
RETURN |
Нет |
Нет |
Нет |
RETURN TO MASTER |
Нет |
Нет |
Нет |
RETURN TO < ProcedureName > |
Нет |
Нет |
Нет |
SET STEP ON |
Да |
Да |
Да |
SUSPEND |
Да |
Да |
Да |
THROW |
Да |
Да |
Да |
![]() |
---|
Вы можете включить команды типа LOOP в блоке, если Вы размещаете её во внедренной циклической конструкции типа FOR EACH...ENDOR или DO WHILE...ENDDO . Вы можете вызвать команду ERROR из блоков TRY , CATCH , или FINALLY . TRY...CATCH...FINALLY обрабатывает команду ERROR подобно любому другому исключению или использованию команды THROW . |
Выполнение инструкции FINALLY
Если программа определяет местонахождение интструкции FINALLY , она выполняет код, который находится в блоке FINALLY . Блок FINALLY обычно закрывает все ресурсы, размещенные блоком TRY и всегда является последним кодом, который выполнится до завершения структуры TRY...CATCH...FINALLY .
Блок FINALLY выполняется всегда, когда происходит исключение, необработанное или другое, даже если выполняется другой обработчик исключений, типа процедуры ON ERROR или событие объекта Error .
![]() |
---|
Вы не можете явно передать управление вашей программой непосредственно блоку CATCH или FINALLY . Вы не можете обойти интсрукцию FINALLY, если она существует, в том случае, если Вы не используете команду CANCEL , чтобы остановить выполнение программы. Если Вы желаете игнорировать интструкцию FINALLY , Вы должны предусмотреть код в начале блока FINALLY , который проверяет условие и выходит из блока, если это условие выполнено. |
После выполнения блока FINALLY , программа переходит к инструкции следующей сразу после инструкции ENDTRY . Инструкция ENDTRY завершает структуру TRY...CATCH...FINALLY .
См. Также
Другие Ресурсы
Класс и Объектная Обработка ошибокПроцедурная Обработка ошибок
Приоритет Обработчика Ошибки
Отладка и язык Error-Handling
Обработка ошибок Run-Time
Испытание и Отладка Приложений