處理錯誤範例:CustomErrors 應用程式

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

CustomErrors 應用程式會示範在建立應用程式時,處理自訂錯誤的技巧。這些技巧包括:

  • 驗證 XML 封包

  • 編寫自訂錯誤

  • 擲回自訂錯誤

  • 於錯誤擲回時通知使用者

若要取得此樣本的應用程式檔案,請參閱 www.adobe.com/go/learn_programmingAS3samples_flash_tw 。您可以在 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

類別,會定義用來驗證使用者所提供之 employee 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>; 
}

XML 封包稍後將顯示在「舞台」的 TextArea 組件實體上。這個步驟可以讓您在嘗試重新驗證 XML 封包前加以修改。

當使用者按下「驗證」按鈕時,就會呼叫 validateData() 方法。這個方法會使用 Validator 類別中的 validateEmployeeXML() 方法,驗證 employee 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 封包有效, status Label 組件實體就會顯示成功的訊息,而應用程式也會結束。如果 validateEmployeeXML() 方法擲回自訂錯誤 (也就是 FatalError、WarningError 或一般 Error),則會執行適當的 catch 陳述式,並呼叫 showFatalError() showWarningError() showGenericError() 方法。這些方法都會在名為 statusText 文字區域中顯示適當的訊息,明確通知使用者發生了什麼錯誤。每一種方法也都會以明確的訊息,更新 status Label 組件實體。

如果在嘗試驗證 employee 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 引數就是您要查詢的錯誤代碼。例如,若您傳遞的 id 為 9001,則會擷取到一個錯誤,告訴您只能為員工指定一個成本中心。如果有一個以上的錯誤具有相同的錯誤代碼,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); 
}