Файл: ...\Samples\Solution\Toledo\TryCatch.scx
Вы можете осуществить структурированную обработку исключений с помощью структуры обработки ошибок TRY...CATCH...FINALLY для запуска конкретного блока предложений, если указанное исключение произошло во время исполнения вашей программы. Когда происходит ошибка или возникает исключение, то тогда создается объект Exception.
Этот образец показывает, как отловить исключение с помощью блоков TRY и CATCH, очистить ресурсы с помощью блока FINALLY и переместить, или передать исключение высшему обработчику с помощью THROW.
Для получения более подробной информации смотрите описания Структурированная обработка ошибок, Команда TRY...CATCH...FINALLY Command и Объект Exception.
Отлов исключений
В этом образце, вы можете выбрать ошибку или исключение, которые вы желаете в блоке TRY и посмотреть свойства объекта Exception, сгенерированного из исключения.
Для проявления исключения
-
На закладке CATCHing Exceptions выберите желаемую ошибку из выпадающего списка и щелкните по Execute TRY block.
Исполняется блок CATCH и отображает свойства объекта Exception.
Приведенный код показывает структуру обработки ошибки в этом, частном образце. Обычно код, который может сгенерировать исключение появляется в блоке TRY; однако, команда ERROR вызывается специально для того, чтобы показать как передается управление в блок CATCH только в случае возникновения ошибки.
Вы можете использовать свойство UserValue объекта Exception для хранения любой дополнительной информации об ошибке.
![]() | |
---|---|
TRY ERROR nErrorCode CATCH TO myException myException.UserValue = "I can handle this." ENDTRY |
Очистка ресурсов
Блок FINALLY обычно очищает любые ресурсы, размещаемые блоком TRY и всегда является последним блоком, исполняемым перед выходом из структурыTRY...CATCH...FINALLY.
Для наблюдения, как FINALLY исполняется после всего прочего кода
-
На закладке Using FINALLY выберите опцию или напечатайте имя таблицы и путь в combobox и щелкните по TRY.
Приведенный ниже пример кода показывает, как исполняется FINALLY после всего прочего кода.
![]() | |
---|---|
TRY lnPrevArea = SELECT() USE CUSTOMERS IN 0 EXCLUSIVE * обрабатывает при отсутствии файла. CATCH TO myException WHEN myException.ErrorNo = 1 * Обрабатывается, если файл занят. CATCH TO myException WHEN myException.ErrorNo = 3 * Обрабатывается, когда запрещен доступ к файлу. CATCH TO myException WHEN myException.ErrorNo = 1704 * отлавливается все остальное. CATCH TO myException * Код в блоке FINALLY исполняется всегда. FINALLY IF USED('CUSTOMERS') USE IN CUSTOMERS ENDIF SELECT (lnPrevArea) ENDTRY |
Передача исключения
Для передачи исключения обработчику ошибок более высокого уровня, используйте предложение THROW в блоке CATCH.
Этот пример использует вложенные блоки TRY. Самый внутренний блок TRY
может обработать только первую ошибку. Для последующих ошибок, самый внутренний
блок TRY передает объект Exception внешнему блоку TRY.
Когда конкретное исключение передано, в данном примере THROW
oMyException
, свойство UserValue отловленного исключения во
внешнем блоке содержит исключение, переданное из внутреннего блока.
![]() | |
---|---|
TRY * исполняется некий код. TRY * Произошла ошибка. ERROR 3 CATCH TO InnerException WHEN InnerException.ErrorNo = 1 InnerException.UserValue = "INNER TRY: I can handle this." CATCH TO InnerException InnerException.UserValue = "INNER TRY: I can't handle this." * Ошибка не может быть обработана, поэтому передается внешнему блоку TRY. THROW InnerException ENDTRY CATCH TO OuterException * В этом случае, когда исключение передано, отловленное исключение содержится в свойстве * UserValue. ? OuterException.UserValue.UserValue ENDTRY |
Вы можете, кроме того, передавать наверх строку сообщения. В этом случае, строка сообщения хранится в свойстве UserValue внешнего исключения:
![]() | |
---|---|
TRY * Запускается некий код. TRY * Произошла ошибка. ERROR 1 CATCH THROW "INNER TRY: I can't handle this one." ENDTRY CATCH TO OuterException ? OuterException.UserValue ENDTRY |