處理錯誤範例:CustomErrors 應用程式Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本 CustomErrors 應用程式會示範在建立應用程式時,處理自訂錯誤的技巧。這些技巧包括:
若要取得此樣本的應用程式檔案,請參閱 www.adobe.com/go/learn_programmingAS3samples_flash_tw。您可以在 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>;
}
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);
}
|
|