处理错误示例:CustomErrors 应用程序Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 CustomErrors 应用程序展示了构建应用程序时使用自定义错误的一些技巧。这些方法包括:
若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/CustomError 文件夹中找到 CustomErrors 应用程序的文件。该应用程序包含以下文件:
CustomErrors 应用程序概述当应用程序加载时,将为 Flex 应用程序调用 initApp() 方法,或者为 Flash Professional 应用程序执行时间轴(非函数)代码。此代码定义将由 Validator 类验证的示例 XML 包。以下代码运行: employeeXML = <employee id="12345"> <firstName>John</firstName> <lastName>Doe</lastName> <costCenter>12345</costCenter> <costCenter>67890</costCenter> </employee>; } 稍后,将在舞台上的 TextArea 组件实例中显示该 XML 包。此步骤允许您在尝试重新验证 XML 包之前对其进行修改。 用户单击 Validate 按钮时,将调用 validateData() 方法。该方法使用 Validator 类中的 validateEmployeeXML() 方法来验证员工 XML 包。以下显示的是 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); } } 首先,使用 TextArea 组件实例 xmlText 的内容创建一个临时的 XML 对象。接下来,将调用自定义 Validator 类 (com.example.programmingas3/errors/Validator.as) 中的 validateEmployeeXML() 方法,并将临时 XML 对象作为参数传递。如果这个 XML 包是有效的,Label 组件实例 status 便会显示一条成功消息,然后应用程序退出。如果 validateEmployeeXML() 方法引发了一个自定义错误(即发生 FatalError、WarningError 或一般的 Error),则会执行相应的 catch 语句并调用 showFatalError()、showWarningError() 或 showGenericError() 方法。这几种方法均会在一个名为 statusText 的文本区域中显示相应的消息,以通知用户发生了特定错误。每个方法还会用具体的消息更新 Label 组件实例 status。 如以下代码所示,如果尝试验证员工 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 TextField 和 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 验证程序最后检查用户是否只定义了一个社会安全号码(XML 包中的 ssn 节点)。如果具有不止一个 ssn 节点,则引发 FatalError 错误。 您可以向 validateEmployeeXML() 方法添加其他检查,例如,确保 ssn 节点包含有效编号,或者员工至少定义了一个电话号码和电子邮件地址,并且两个值均有效。您还可以对该 XML 进行修改,使每个员工具有唯一的 ID 并指定其管理者的 ID。 定义 ApplicationError 类ApplicationError 类用作 FatalError 类和 WarningError 类的基类。ApplicationError 类扩展了 Error 类,并且定义了自己的自定义方法和属性,其中包括定义一个错误 ID、严重程度以及包含自定义错误代码和消息的 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 参数就是要查找的错误的错误代码。例如,传递等于 9001 的 id 值将得到错误消息“Employee must be assigned to only one cost center”(只能为员工指定一个成本中心)。如果多个错误具有同一错误代码,ActionScript 将只为找到的第一个结果返回错误消息(所返回 XMLList 对象中的 message[0])。 该类中的下一个方法 getTitle() 不使用任何参数,并返回一个字符串值,其中包含此特定错误的错误 ID。该值用于帮助您轻松识别在验证 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 类中定义的静态常量设置错误的严重性,另外还调用 ApplicationError 类中的 getMessageText() 方法获取特定错误的错误消息。FatalError 构造函数如下所示: public function FatalError(errorID:int) { id = errorID; severity = ApplicationError.FATAL; message = getMessageText(errorID); } FatalError 类中的下一个方法 getTitle() 覆盖先前在 ApplicationError 类中定义的 getTitle() 方法,并在标题后面追加文字“-- FATAL”以通知用户发生了致命错误。getTitle() 方法如下所示: public override function getTitle():String { return "Error #" + id + " -- FATAL"; } 该类中的最后一个方法 toString() 覆盖 ApplicationError 类中定义的 toString() 方法。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); } |
|