Дополнение для страницы с описанием Обработки ошибок.

Больше
12 дек 2014 16:14 #1 от mloony
COM_KUNENA_MESSAGE_CREATED_NEW
Написал небольшое описание блока CATCH.
Возможно текст будет полезен для дополнения текста на странице progress-abl.ru/index.php/abl/30-obrabotka-oshibok

Блок CATCH.

Синтаксис:

block-statements

CATCH error-variable AS [ CLASS ] error-class:
catch-logic
END [ CATCH ].
[ block-end-statement ]


block-statements - описание внешнего блока

Блок CATCH, помещенный внутри блока, обрабатывает происходящие
во внешнем блоке ошибки. CATCH подавляет системные сообщения во внешнем
блоке (не обязательно использовать NO-ERROR).

Блок CATCH можно использовать внутри блоков:
  • CATCH block (рекурсивно, блок CATCH внутри блока CATCH),
  • DO (в конструкции DO TRANSACTION или DO ON ERROR, UNDO),
  • FOR,
  • REPEAT,
  • В конце файла процедуры (.p procedure file),
  • Внутри процедуры,
  • Внутри функции определенной пользователем,
  • Внутри методов, свойтв, конструкторов и деструкторов,
  • ON,
  • FINALLY.

error-variable - переменная объект - экземпляр класса error-class.
Явное описание переменной не требуется.

error-class - один из встроенных классов ошибок:
  • Progress.Lang.SysError - для системных ошибок,
  • Progress.Lang.AppError - для ошибок приложения,
  • Progress.Lang.Error - интерфейс реализующий основные методы для классов ошибок.
Так же можно описать расширение встроенного класса Progress.Lang.AppError для создания собственных классов ошибок.

Экземпляр класса имеет следующие методы и свойства:
  • CallStack - свойство хранит стек вызовов в момент возникновения ошибки. (работает если SESSION:ERROR-STACK-TRACE = TRUE),
  • NumMessages - свойство хранит колличество сообщений,
  • Severity - свойтво для реализации ранжирования сообщений по степени серьезности,
  • GetMessage(index) - метод возвращает текст сообщения ошибки,
  • GetMessageNum(index) - метод возращает номер сообщения ошибки.
Блок CATCH располагается в конце внешнего блока. После блока CATCH можно использовать блок FINALLY, который тоже может содержать собственный блок CATCH.

Пример:
DO ON ERROR UNDO:
   DO ON ERROR UNDO:
      
      FIND FIRST _user WHERE _user._Userid EQ "000000000" NO-LOCK.
      MESSAGE _user._User-name.
      
      CATCH eError AS Progress.Lang.Error:
         MESSAGE "Нашли ошибку, передаем родителю." VIEW-AS ALERT-BOX.
         UNDO, THROW eError. 
         
         /* UNDO - откатывает выполнение блока
         THROW - "передает" ошибку родительскому блоку. */
         
      END CATCH.
   END. /* DO ON ERROR UNDO */
   
   /* Сгенерированная оператором THROW ошибка обрабатывается в блоке родителе */
   CATCH eError AS Progress.Lang.Error:
      MESSAGE "Родитель нашел ошибку, передает родителю дальше." VIEW-AS ALERT-BOX.
      UNDO, THROW eError. /* И ошибка передается следующему родителю */
   END CATCH.
END. /* DO ON ERROR UNDO */

CATCH eError AS Progress.Lang.Error:
   MESSAGE "Самый старший ее обработал." VIEW-AS ALERT-BOX.
   MESSAGE COLOR "Bright-Red" eError:GetMessage(1) VIEW-AS ALERT-BOX.

/* Блоков CATCH много не бывает :) 
   Во вложенном блоке нельзя использовать имя объект такое же как и во внешнем блоке CATCH*/
   CATCH internaleError AS Progress.Lang.Error:
      UNDO, THROW internaleError.
   END CATCH.
END CATCH.

FINALLY:
   MESSAGE "Это сообщение появится последним в любом случае." VIEW-AS ALERT-BOX.
   
   CATCH eError AS Progress.Lang.Error:
      UNDO, THROW eError.
   END CATCH.
END FINALLY.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • alex_sar
  • Посетитель
  • Посетитель
16 дек 2014 09:41 #2 от alex_sar
COM_KUNENA_MESSAGE_REPLIED_NEW
Добрый день! Спасибо за дополнение. Добавил Вас в группу Editor, что должно позволить Вам самостоятельно внести Ваши дополнения с сохранением Вашего авторства.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.183 секунд
Вы здесь: Главная Форум Прочее Раздел предложений Дополнение для страницы с описанием Обработки ошибок.