Файл: ...\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 для хранения любой дополнительной информации об ошибке.

 CopyCode imageСкопировать код
TRY
   ERROR nErrorCode
CATCH TO myException
myException.UserValue = "I can handle this."
ENDTRY

Очистка ресурсов

Блок FINALLY обычно очищает любые ресурсы, размещаемые блоком TRY и всегда является последним блоком, исполняемым перед выходом из структурыTRY...CATCH...FINALLY.

Для наблюдения, как FINALLY исполняется после всего прочего кода

  • На закладке Using FINALLY выберите опцию или напечатайте имя таблицы и путь в combobox и щелкните по TRY.

Приведенный ниже пример кода показывает, как исполняется FINALLY после всего прочего кода.

 CopyCode imageСкопировать код
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 отловленного исключения во внешнем блоке содержит исключение, переданное из внутреннего блока.

 CopyCode imageСкопировать код
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 внешнего исключения:

 CopyCode imageСкопировать код
TRY   
   * Запускается некий код.
   TRY
      * Произошла ошибка.
        ERROR 1
   CATCH
      THROW "INNER TRY: I can't handle this one."
   ENDTRY
CATCH TO OuterException 
   ? OuterException.UserValue
ENDTRY      

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