Введение в структурную обработка ошибок
Мы только что завершили рассмотрение традиционной обработки ошибок в ABL и переходим к рассмотрению структурной обработки ошибок.
Кратко напомним основные элементы традиционной обработки ошибок и укажем связанные со структурной обработкой отличия (Таблица 9).
Далее мы рассмотрим новые возможности языка ABL, связанные со структурной обработкой ошибок:
- Иерархия классов ошибок ABL и как они относятся с специфическим способам применения блоков CATCH.
- Все о блоках CATCH детальными примерами кода
- Использование директивы THROW
- Использование блоков FINALLY
Таблица 9. Особенности структурной обработки ошибок
Концепция |
Особенности структурной обработки |
Возникновение состояния ERROR | Обычно возникновение ошибки в операторах не зависит от модели обработки ошибок. Однако, наличие в блоке блока CATCH позволяет обрабатывать ошибки более единообразно, включая ошибки, которые не могут быть обработаны с использованием фразы ON ERROR или опции NO-ERROR.
В частности, можно будет обработать ошибки в операторе MESSAGE. Ошибки встроенных методов объектов ABL также могут быть обработаны как ERROR (а не WARNING). Отметим, что наличие в блоке блока CATCH делает блок откатываемым. Опция NO-ERROR будет полезна и здесь – для подавления ошибки и предотвращения отката блока. |
Понимание сообщений об ошибках | Системные сообщения об ошибках остаются теми же. В структурной обработке они заключены в объекты ошибок, так что доступ к ним осуществляется с помощью свойств и методов объекта ошибки, а не с помощью атрибутов и методов ERROR-STATUS. |
Обработка ошибок в блоках | Обработка ошибок в блоках по умолчанию – одинакова для обоих моделей |
Опции обработки ошибки в блоках | Для явной обработки ошибок в блоках фраза ON ERROR и оператор UNDO поддерживают опцию THROW. THROW подавляет выдачу системных сообщений об ошибках, выходит из блока и передает ошибку для обработки ближайшему внешнему блоку. |
Подавление ошибок | Если активен блок CATCH для данного типа ошибки, сообщение об ошибке не выдается. Вместо этого для ошибки создается соответствующий объект.
Если для данного типа ошибки блока CATCH нет, то будет выдаваться стандартное системное сообщение. Опция NO-ERROR является важной частью структурной обработки ошибок. Это единственный способ подавить установку состояния ERROR. Даже если блок CATCH для данной ошибки существует, он проигнорирует ошибку в операторе с опцией NO-ERROR. |
Проверка на ошибку после опции NO-ERROR и переход к пользовательской логике обработки ошибки
|
Если Вы используете опцию NO-ERROR для предотвращения обработки ошибки блоком CATCH, тогда ERROR-STATUS по-прежнему является инструментом для проверки возникновения ошибки. Можно рассматривать комбинацию NO-ERROR и ERROR-STATUS как миниатюрный блок CATCH для одного оператора. |
Установка состояния ERROR и пользовательские данные об ошибке | Оператор RETURN ERROR и опция RETURN фразы ON ERROR и оператора UNDO по- прежнему позволяют Вам управлять созданием ошибок приложения. Вы также можете теперь создавать свой собственный объект ошибки (THROW). Опция THROW позволяет также устанавливать ошибку в пользовательских функциях. |
Откат транзакций | По-прежнему используется оператор UNDO. Структурная обработка ошибок добавляет к нему опцию THROW. |
Обработка состояний STOP и QUIT | Структурная обработка ошибок не поддерживает обработку состояний STOP и QUIT. |
Новые возможности языка.
Для поддержки структурной обработки ошибок в язык ABL были добавлены следующие возможности:
- Расширяемая иерархия классов, позволяющая представлять системные ошибки OpenEdge и пользовательские ошибки приложения как объекты.
- Оператор CATCH, позволяющий определить блок обработки ошибок, связанный с конкретным типом ошибки и любым откатываемым блоком ABL.
- Директива UNDO, THROW во фразе ON ERROR, позволяющая перенаправить необработанную ошибку в ближайший внешний блок.
- Опция TROW в операторе UNDO, инструмент для генерирования пользовательских ошибок приложения.
- Оператор ROUTINE-LEVEL ON ERROR UNDO, THROW. Этот оператор изменяет неявную фразу ON ERROR для всех процедурных блоков в файле процедуры или класса (разумеется, на UNDO, THROW).
- Оператор FINALLY, определяющий конечный блок, который должен выполняться в конце блока ABL (или каждой его итерации), независимо от того, был ли блок выполнен успешно, или возникла (и могла быть обработана CATCH) ошибка.