Пример обработки ошибок: программа CustomErrorsFlash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий Приложение CustomErrors демонстрирует методы работы с пользовательскими ошибками при создании программы. Рассматриваются следующие техники:
Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения CustomErrors находятся в папке Samples/CustomError. Приложение состоит из следующих файлов.
Рассмотрение приложения CustomErrorsПри загрузке приложений Flex вызывается метод initApp(), а при загрузке приложений Flash Professional выполняется код временной шкалы (при отсутствии функций). Этот код определяет образец пакета XML, который необходимо проверить с помощью класса Validator. Выполняется следующий код: employeeXML = <employee id="12345"> <firstName>John</firstName> <lastName>Doe</lastName> <costCenter>12345</costCenter> <costCenter>67890</costCenter> </employee>; } Пакет XML позже отображается в экземпляре компонента TextArea в рабочей области. Это позволяет модифицировать пакет XML перед попыткой его повторного подтверждения. При нажатии кнопки Validate (Подтвердить) вызывается метод validateData(). Этот метод проверяет служебный пакет XML (список служащих) с помощью метода validateEmployeeXML() класса Validator. Следующий код демонстрирует метод validateData(): function validateData():void { try { var tempXML:XML = XML(xmlText.text); Validator.validateEmployeeXML(tempXML); status.text = "The XML was successfully validated."; } catch (error:FatalError) { showFatalError(error); } catch (error:WarningError) { showWarningError(error); } catch (error:Error) { showGenericError(error); } } Прежде всего создается временный объект XML с помощью содержимого экземпляра компонента TextArea — xmlText. Затем вызывается метод validateEmployeeXML() в пользовательском классе Validator com.example.programmingas3/errors/Validator.as), который передает временный объект XML в качестве параметра. Если пакет XML оказывается действительным, экземпляр status компонента Label отображает подтверждающее сообщение и приложение закрывается. Если метод validateEmployeeXML() генерирует пользовательскую ошибку (то есть FatalError, WarningError или базовую ошибку Error), выполняется соответствующая инструкция catch , которая вызывает один из следующих методов: showFatalError(), showWarningError() или showGenericError(). Каждый из этих методов отображает в текстовой области с именем statusText соответствующее сообщение для уведомления пользователя о возникновении специфической ошибки. Каждый метод обновляет также экземпляр status компонента Label специальным сообщением. Если при попытке подтверждения служебного пакета XML происходит фатальная ошибка, в текстовой области statusText отображается сообщение об ошибке, а экземпляр xmlText компонента TextArea и экземпляр validateBtn компонента Button отключаются, как показано в следующем коде: function showFatalError(error:FatalError):void { var message:String = error.message + "\n\n"; var title:String = error.getTitle(); statusText.text = message + " " + title + "\n\nThis application has ended."; this.xmlText.enabled = false; this.validateBtn.enabled = false; hideButtons(); } Если вместо фатальной ошибки происходит предупреждающая ошибка, в текстовой области statusText также отображается сообщение об ошибке, но экземпляры компонентов TextArea (xmlText) и Button не отключаются. Метод showWarningError() отображает сообщение о пользовательской ошибке в текстовой области statusText. Также в сообщении пользователю предлагается сделать выбор: продолжить подтверждение XML или отменить выполнение сценария. Следующий фрагмент демонстрирует метод showWarningError(): function showWarningError(error:WarningError):void { var message:String = error.message + "\n\n" + "Do you want to exit this application?"; showButtons(); var title:String = error.getTitle(); statusText.text = message; } Метод closeHandler() вызывается при нажатии кнопок «Да» или «Нет». Следующий фрагмент демонстрирует метод closeHandler(): function closeHandler(event:CloseEvent):void { switch (event.detail) { case yesButton: showFatalError(new FatalError(9999)); break; case noButton: statusText.text = ""; hideButtons(); break; } } Если пользователь решает отменить выполнение сценария нажатием кнопки «Да», генерируется фатальная ошибка FatalError, что приводит к закрытию приложения. Создание пользовательского валидатораПользовательский класс Validator содержит один метод validateEmployeeXML(). Метод validateEmployeeXML() использует один аргумент employee, который представляет собой проверяемый пакет XML. Метод validateEmployeeXML() имеет следующую структуру: public static function validateEmployeeXML(employee:XML):void { // checks for the integrity of items in the XML if (employee.costCenter.length() < 1) { throw new FatalError(9000); } if (employee.costCenter.length() > 1) { throw new WarningError(9001); } if (employee.ssn.length() != 1) { throw new FatalError(9002); } } Для утверждения служащий должен принадлежать к одному (и только одному) центру учета затрат. Если служащий не принадлежит ни к одному центру учета затрат, метод генерирует неустранимую ошибку FatalError, которая передается методу validateData() в главном файле приложения. Если служащий принадлежит к нескольким центрам учета затрат, генерируется предупреждающая ошибка WarningError. Окончательная проверка в валидаторе XML приводит к тому, что пользователь получает только один номер социального страхования (узел ssn в пакете XML). Если обнаружить только один узел ssn не удается, генерируется фатальная ошибка FatalError. К методу validateEmployeeXML() можно добавить дополнительные проверки. Например, подтверждение того, что узел ssn содержит действительный номер или что служащий имеет хотя бы один телефонный номер и адрес электронной почты, а также что оба значения являются действительными. Можно также модифицировать XML таким образом, что каждый служащий и его менеджер будут иметь уникальные идентификационные номера. Определение класса ApplicationErrorКласс ApplicationError служит основой для классов FatalError и WarningError. Класс ApplicationError является расширением класса Error. Он определяет свои специальные методы и свойства, включая идентификаторы ошибок и степень их серьезности, а также объект XML, содержащий коды и сообщения пользовательских ошибок. Этот класс также включает две статические постоянные, которые используются для определения степени серьезности для каждого типа ошибок. Метод конструктора класса ApplicationError имеет следующую структуру: public function ApplicationError() { messages = <errors> <error code="9000"> <![CDATA[Employee must be assigned to a cost center.]]> </error> <error code="9001"> <![CDATA[Employee must be assigned to only one cost center.]]> </error> <error code="9002"> <![CDATA[Employee must have one and only one SSN.]]> </error> <error code="9999"> <![CDATA[The application has been stopped.]]> </error> </errors>; } Каждый узел ошибки в объекте XML содержит уникальный числовой код и сообщение об ошибке. Сообщения об ошибках легко просмотреть по их коду с помощью E4X, как показано в следующем методе getMessageText(): public function getMessageText(id:int):String { var message:XMLList = messages.error.(@code == id); return message[0].text(); } Метод getMessageText() принимает один целочисленный аргумент id и возвращает строку. Аргумент id является кодом ошибки, по которому эту ошибку можно найти. Например, поиск по id 9001 выдает ошибку, в сообщении которой говорится, что каждый служащий должен приписываться только к одному центру учета затрат. Если несколько ошибок имеют одинаковый код, ActionScript возвращает сообщение об ошибке только для первого найденного результата (message[0] в возвращенном объекте XMLList). Следующий метод в этом классе, а именно getTitle(), не принимает никаких параметров и возвращает строковое значение, содержащее идентификатор для данной специфической ошибки. Это значение позволяет пользователю легко определить, какая именно ошибка произошла в процессе проверки пакета XML. Следующий фрагмент демонстрирует метод getTitle(): public function getTitle():String { return "Error #" + id; } Последним методом в классе ApplicationError является toString(). Этот метод заменяет функцию, определенную в классе Error, позволяя настроить передачу сообщения об ошибке. Этот метод возвращает строку, которая определяет номер специфической ошибки и сообщение о том, что произошло. public override function toString():String { return "[APPLICATION ERROR #" + id + "] " + message; } Определение класса FatalErrorКласс FatalError является расширением пользовательского класса ApplicationError. Он определяет три метода: конструктор FatalError, getTitle() и toString(). Первый метод, конструктор FatalError, принимает один целочисленный аргумент, errorID, задает степень серьезности ошибки с помощью значений статической постоянной, определенной в классе ApplicationError, и получает сообщение о специфической ошибке, вызывая метод getMessageText() класса ApplicationError. Конструктор FatalError имеет следующую структуру: public function FatalError(errorID:int) { id = errorID; severity = ApplicationError.FATAL; message = getMessageText(errorID); } Следующий метод в классе FatalError, getTitle(), заменяет метод getTitle(), определенный ранее в классе ApplicationError, и дополняет текст заголовком «FATAL», уведомляя таким образом пользователя о фатальной ошибке. Метод getTitle() имеет следующую структуру: public override function getTitle():String { return "Error #" + id + " -- FATAL"; } Последний метод в этом классе, toString(), заменяет метод toString(), определенный в классе ApplicationError. Метод toString() имеет следующую структуру: public override function toString():String { return "[FATAL ERROR #" + id + "] " + message; } Определение класса WarningErrorКласс WarningError является расширением класса ApplicationError. Он практически идентичен классу FatalError, за исключением пары небольших изменений в строках и установки серьезности ошибки ApplicationError.WARNING вместо ApplicationError.FATAL, как показано в следующем коде: public function WarningError(errorID:int) { id = errorID; severity = ApplicationError.WARNING; message = super.getMessageText(errorID); } |
|