Вы можете использовать команду 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 Команда .

Генерирование Исключений

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()
DO myProc1
PROCEDURE myProc1
?1
THROW 11
?2
ENDPROC

Помните что намеренный вызов 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 .

См. Также