錯誤類型

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 類別的實體或者是它的子類別之一,則堆疊追蹤資訊也會出現在輸出中。如需有關使用 Flash 執行階段除錯程式版本的詳細資訊,請參閱 使用 Flash 執行階段的除錯程式版本

    備註: 在處理 uncaughtError 事件時,如果從 uncaughtError 處理常式擲出錯誤事件,會多次呼叫事件處理常式。這會造成無限迴圈的例外。建議您避免這種情況。