处理错误示例:CustomErrors 应用程序

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

CustomErrors 应用程序展示了构建应用程序时使用自定义错误的一些技巧。这些方法包括:

  • 验证 XML 包

  • 编写自定义错误

  • 引发自定义错误

  • 引发错误时通知用户

若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn 。可以在 Samples/CustomError 文件夹中找到 CustomErrors 应用程序的文件。该应用程序包含以下文件:

文件

说明

CustomErrors.mxml

CustomErrors.fla

Flash (FLA) 或 Flex (MXML) 中的主应用程序文件

com/example/programmingas3/errors/ApplicationError.as

一个类,用作 FatalError 类和 WarningError 类的基错误类。

com/example/programmingas3/errors/FatalError.as

用于定义由应用程序引发的 FatalError 错误的类。该类扩展了自定义的 ApplicationError 类。

com/example/programmingas3/errors/Validator.as

一个类,定义了用于验证用户提供的员工 XML 包的单个方法。

com/example/programmingas3/errors/WarningError.as

用于定义由应用程序引发的 WarningError 错误的类。该类扩展了自定义的 ApplicationError 类。

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() 方法。这几种方法均会在一个名为 statusTex t 的文本区域中显示相应的消息,以通知用户发生了特定错误。每个方法还会用具体的消息更新 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); 
}