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

Для получения более подробной информации о структурированной обработке ошибок с использованием команды TRY...CATCH...FINALLY смотрите Структурированная обработка ошибок.

TRY
     [ tryCommands ] 
[ CATCH [ TO VarName ] [ WHEN lExpression ] 
     [ catchCommands ] ]
[ THROW [ eUserExpression ] ]
[ EXIT ]
[ FINALLY 
     [ finallyCommands ] ] 
ENDTRY

Параметры

TRY

Указывает начало структуры TRY...CATCH...FINALLY structure.

[ tryCommands ]

Определяет предложения, команды и прочее, которые могут вызвать генерацию ошибки при исполнении.

[CATCH]

Указывает на начало блока CATCH, который будет обрабатывать подходящие ошибки. Вы можете указать оператор CATCH без аргументов, что будет оцениваться в CATCH WHEN .T. (True).

NoteTip

Если вы желаете иметь структуру TRY...CATCH...FINALLY, которая будет отлавливать все ошибки, то убедитесь в том, что ваш оператор CATCH будет всегда оцениваться в True (.T.).

Вы можете указать любое количество операторов CATCH; или вы вообще можете его не указывать.

[TO VarName]

Указывает переменную памяти, но не объектную ссылку, в которой будет сохраненан ссылка на создаваемый объект Exception. VarName может быть только простой переменной памяти, но не ссылкой на свойство объекта.

Вы можете явно установить VarName в любое значение в структуре TRY...CATCH...FINALLY. Значение не будет изменено до тех пор, пока не будет исполнен другой оператор CATCH, что приведет к сбросу значения VarName в NULL.

VarName может иметь области видимости "local", "public", или "private", что зависит от того, как переменная была задекларирована. Если VarName не была задекларирована ранее, то она будет иметь область видимости "private". Объект Exception создается с той же самой областью видимости, как и VarName. Когда VarName выходит за пределы области видимости, высвобождается или сбрасывается, то высвобождается и объект Exception.

Когда исполняется оператор CATCH TO VarName, Visual FoxPro всегда устанавливает переменную VarName в новый объект Exception, независимо от ее предыдущей установки, даже если она,VarName, остается в своей доступной области видимости . Поэтому содержание VarName всегда переписывается, независимо от того, на что она раньше ссылалась.

[WHEN lExpression]

Указывает необязательно логическое выражение для оценки, когда в программе встречается оператор CATCH. Выражение должно оцениваться в True (.T.) для запуска соответствующих catchCommands.

Аргумент для lExpression может содержать ссылку на VarName, по сути на объект Exception, так чтобы вы могли запросить выявившуюся ошибку и соответствующим образом ее обработать.

Если опция WHEN оценивается в False (.F.), Visual FoxPro высвобождает объект Exception и сбрасывает переменную VarName в NULL. Вы можете определить, была ли сброшена переменная VarName в NULL или установлена в объект, с помощью функции VARTYPE( ).

[ catchCommands ] ]

Определяет операторы, предложения и прочее, что будет исполнено при встрече в коде программы оператора CATCH.

[THROW [ eUserExpression ] ]

Создает новый объект Exception, отлавливаемый оператором CATCH. Вы можете вызывать THROW из любого блока кода в структуре TRY...CATCH...FINALLY. Однако, вы можете использовать THROW повсюду в коде, к котором существует обработчик ошибок, для захвата исключения. Вы не можете вызвать THROW из командного окна (Command window).

Caution noteПредупреждение

Вызов команды THROW вне структуры TRY...CATCH...FINALLY и без подходящего обработчика ошибок приведет к выходу из программы.

NoteЗамечание

Приложения, исполняемые в Run-time должны заключать команду THROW во внешней структуре TRY...CATCH...FINALLY. Visual FoxPro игнорирует любые предложения THROW, появляющиеся в опции CATCH WHEN  lExpression.

Параметр eUserExpression указывает выражение любого типа и устанавливает свойство UserValue исключения. Вы можете посылать ему объект любого типа, так как свойство UserValue исключения хранит только ссылку на объект.

Когда вы включаете eUserExpression в опцию THROW, Visual FoxPro устанавливает значение свойства ErrorNo исключения в 2071, что соответствует ошибке "User Thrown Error (Error 2071)".

NoteЗамечание

Вы должны послать значение параметру eUserExpression, в которое будет установлено свойство UserValue исключения для того, чтобы вы смогли выстроить в цепочку множество объектов Exception. Для получения более подробной информации о выстраивании последовательности объектов Exception смотрите раздел "Пример".

Если вы опустите eUserExpression, Visual FoxPro поднимет оригинальный объект Exception, если он существует. Если же объект Exception не существует, Visual FoxPro выстроит новый объект Exception с установленным значением свойства ErrorNo равным 2071. Если вы опустите eUserExpression, а опция THROW поднимет объект Exception до внешнего блока TRY...CATCH, то внешний блок TRY...CATCH захватит тот же самый объект Exception. Значения, возвращаемые функциями ERROR( ), MESSAGE( ) и AERROR( ) не могут считаться надежными при использовании их в структурированной обработке исключений, поэтому вы должны вместо них использовать объект Exception.

Если, в случае вызова THROW из блока CATCH или FINALLY, существует внешний блок TRY...CATCH, Visual FoxPro присвоит переменной VarName в опции CATCH TO объектную ссылку на объект Exception, сгенерированный перемещением исключения. Если не существует внешнего блока TRY...CATCH, Visual FoxPro поднимет исключение в событие ON ERROR или Error, если какое-то существует; в противном случае, Visual FoxPro вызовет свой обработчик системных ошибок.

Если вы желате перебросить оригинальное исключение, которое было захвачено с помощью опции CATCH TO   VarName, вы можете для переброски исключения вызвать THROW VarName.

NoteЗамечание

Перенаправление оригинального исключения произведет другой, новый объект Exception, во внешнем операторе CATCH, у которого свойство UserValue будет содержать объектную ссылку на исходное исключение.

Если THROW встретит ошибку при оценке выражения, Visual FoxPro поднимает ее обычным способом.

[EXIT]

Включите это в блок TRY, CATCH или FINALLY для немедленной остановки обработкИ кода в программном блоке.

Если EXIT появится в блоке TRY или CATCH, исполнение программы продолжится в блоке, следующем за оператором FINALLY, если он существует. Если EXIT появится в блоке FINALLY или, если FINALLY не существует, исполнение программы будет продолжено со строки, следующей за оператором ENDTRY.

Для получения более подробной информации смотрите EXIT Command.

[ FINALLY

Указывает начало блока FINALLY, который вы можете использовать для очистки любых ресурсов, размещенных блоком TRY, так как этот блок всегда исполняется, за исключаением случаев, когда используются команды CANCEL и QUIT.

[ finallyCommands ]

Определяет предложения, которые будут исполняться в блоке FINALLY после того, как в блоке TRY не будут найдены ошибки или после исполнения предложений в блоке CATCH.

ENDTRY

Указывает конец структуры TRY...CATCH...FINALLY. Каждая структура TRY...CATCH...FINALLY должна завершаться ключевым словом ENDTRY. Как и в случае других управляющих предложений, вы можете добавить в этой же строке комментарий, предварив его двойным символом ampersand (&&) после ключевого слова ENDTRY.

NoteЗамечание

Если вы не включите ключевое слово ENDTRY в конец структуры TRY...CATCH...FINALLY, Visual FoxPro сгенерирует ошибку при компиляции кода. Хотя вы можете продолжить исполнение кода при наличии такой ошибки, вы не должны использовать такой сценарий, так как это может вызвать зависание Visual FoxPro.

Expand imageПримечания

Expand imageПример

Expand image Смотрите также