錯誤類型
Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本
當您在開發和執行應用程式時,會遇到不同類型的錯誤和錯誤術語。下列清單會介紹主要的錯誤類型和術語:
「編譯階段錯誤」是由 ActionScript 編譯器在程式碼編譯期間提出的。當程式碼出現語法問題,使您無法建立應用程式時,就會發生編譯階段錯誤。
「執行階段錯誤」是在應用程式編譯完成後,於執行時所發生的錯誤。執行階段錯誤是 SWF 檔在 Flash 執行階段 (如 Adobe Flash Player 或 Adobe AIR) 中播放時所造成的錯誤。在大部分情況下,您可以在發生執行階段錯誤時自行處理,並向使用者報告,同時採取適當步驟,讓應用程式順利執行。如果錯誤相當嚴重,例如無法連線至遠端網站或載入必要資料,則可以使用錯誤處理功能,讓應用程式能夠順利完成。
「同步錯誤」是在呼叫函數時所發生的執行階段錯誤。例如,當您嘗試使用特定方法,但是傳遞給方法的引數無效時,Flash 執行階段就會擲回例外。大部分的錯誤都會同步發生 (也就是在執行陳述式時),而且控制流程會立即傳遞至最適用的 catch 陳述式。
例如,下列摘錄的程式碼會擲回執行階段錯誤,因為在程式嘗試上傳檔案之前,未先呼叫 browse() 方法:
var fileRef:FileReference = new FileReference();
try
{
fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm"));
}
catch (error:IllegalOperationError)
{
trace(error);
// Error #2037: Functions called in incorrect sequence, or earlier
// call was unsuccessful.
}
在這種情況下,會同步擲回執行階段錯誤,因為 Flash Player 判斷在嘗試上傳檔案前,未先呼叫 browse() 方法。
如需有關同步錯誤處理的詳細資訊,請參閱處理應用程式中的同步錯誤。
「非同步錯誤」是執行階段中不同點發生的執行階段錯誤;它們會產生事件,而且事件偵聽程式會捕捉它們。非同步作業是由函數所啟動的作業,但是函數不會等它完成。您可以建立錯誤事件偵聽程式,以等候應用程式或使用者嘗試部分作業。如果作業失敗,您就以事件偵聽程式捕捉錯誤並回應錯誤事件。接著,事件偵聽程式會呼叫事件處理常式函數,以實用的方式回應錯誤事件。例如,事件處理常式可以啟動對話方塊,提示使用者解決錯誤。
請回想之前的檔案上傳同步錯誤範例。如果您在檔案開始上傳前順利呼叫 browse() 方法,Flash Player 便會傳送數個事件。例如,在上傳開始時會傳送 open 事件。檔案上傳作業順利完成時會傳送 complete 事件。由於事件處理是非同步的 (也就是說,不在特定、已知、預先指定的時間發生),因此請使用 addEventListener() 方法偵聽這些特定事件,如下列程式碼所示:
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.OPEN, openHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse();
function selectHandler(event:Event):void
{
trace("...select...");
var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm");
request.method = URLRequestMethod.POST;
event.target.upload(request);
}
function openHandler(event:Event):void
{
trace("...open...");
}
function completeHandler(event:Event):void
{
trace("...complete...");
}
如需有關非同步錯誤處理的詳細資訊,請參閱對錯誤事件和狀態做出回應。
「未捕捉的例外」是在擲回時,沒有對應邏輯 (例如 catch 陳述式) 可以回應的錯誤。當應用程式擲回錯誤,而且在目前或更高層級找不到能夠處理該錯誤的適當 catch 陳述式或事件處理常式時,這種錯誤就視為未捕捉的例外。
當發生未捕捉的錯誤時,執行階段會傳送 uncaughtError 事件。此事件又稱為「全域錯誤處理常式」。此事件是由 SWF 的 UncaughtErrorEvents 物件所傳送,它可以透過 LoaderInfo.uncaughtErrorEvents 屬性取得。如果未替 uncaughtError 事件註冊偵聽程式,執行階段就會略過未捕捉的錯誤,然後只要錯誤並未停止 SWF,就會嘗試繼續執行。
除了傳送 uncaughtError 事件之外,Flash 執行階段的除錯程式版本會終止目前的指令碼,以回應未捕捉的錯誤。然後,它們會在 trace 陳述式輸出中顯示未捕捉的錯誤,或者將錯誤訊息寫入記錄檔。若例外物件是 Error 類別的實體或者是它的子類別之一,就會呼叫 getStackTrace() 方法。堆疊 trace 陳述式也會顯示在 trace 陳述式輸出或記錄檔。如需有關使用 Flash 執行階段除錯程式版本的詳細資訊,請參閱使用 Flash 執行階段的除錯程式版本。
備註: 在處理 uncaughtError 事件時,如果從 uncaughtError 處理常式擲出錯誤事件,會多次呼叫事件處理常式。這會造成無限迴圈的例外。建議您避免這種情況。