對錯誤事件和狀態做出回應

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

ActionScript 3.0 在錯誤處理方面最重要的一項改良,就是在應用程式執行時,支援對非同步執行階段錯誤回應的錯誤事件處理。(如需非同步錯誤的定義,請參閱錯誤類型)。

您可以建立事件偵聽程式與事件處理常式,回應錯誤事件。許多類別在傳送錯誤事件時,所採用的方式都和傳送其它事件相同。例如,XMLSocket 類別的實體通常會傳送三種類型的事件:Event.CLOSEEvent.CONNECTDataEvent.DATA。然而,當問題發生時,XMLSocket 類別可以傳送 IOErrorEvent.IOErrorSecurityErrorEvent.SECURITY_ERROR。如需有關事件偵聽程式和事件處理常式的詳細資訊,請參閱處理事件

錯誤事件可區分為下列兩種:

  • 擴充 ErrorEvent 類別的 Error 事件

    flash.events.ErrorEvent 類別所包含的屬性和方法,可以用來管理和網路及通訊作業有關的執行階段錯誤。AsyncErrorEvent、IOErrorEvent 和 SecurityErrorEvent 類別都會擴充 ErrorEvent 類別。如果您使用的是 Flash 執行階段除錯程式版本,則無須使用偵聽程式函數,在執行階段便會出現對話方塊,通知您播放程式所遇到的任何錯誤事件。

  • 以狀態為架構的錯誤事件

    以狀態為架構的錯誤事件和網路與通訊類別的 netStatusstatus 屬性有關。如果 Flash 執行階段在讀取或寫入資料時遇到問題,netStatus.info.levelstatus.level 屬性的值 (視您所使用的類別物件而定) 便會設定為 "error" 值。如果您要回應這個錯誤,請檢查事件處理常式函數中的 level 屬性是否包含 "error" 這個值。

處理錯誤事件

ErrorEvent 類別及其子類別所包含的錯誤類型,可用來處理 Flash 執行階段在嘗試讀取或寫入資料時所傳送的錯誤。

下列範例會使用 try..catch 陳述式和錯誤事件處理常式,顯示在嘗試讀取本機檔案時所偵測到的任何錯誤。您可以加入較複雜的處理程式碼,以便為使用者提供選項,或是在註解「您的錯誤處理程式碼在這裡」所指示的地方自動處理錯誤:

package 
{ 
    import flash.display.Sprite; 
    import flash.errors.IOError; 
    import flash.events.IOErrorEvent; 
    import flash.events.TextEvent; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 
    import flash.text.TextFieldAutoSize; 
 
    public class LinkEventExample extends Sprite 
    { 
        private var myMP3:Sound; 
        public function LinkEventExample() 
        { 
            myMP3 = new Sound(); 
            var list:TextField = new TextField(); 
            list.autoSize = TextFieldAutoSize.LEFT; 
            list.multiline = true; 
            list.htmlText = "<a href=\"event:track1.mp3\">Track 1</a><br>"; 
            list.htmlText += "<a href=\"event:track2.mp3\">Track 2</a><br>"; 
            addEventListener(TextEvent.LINK, linkHandler); 
            addChild(list); 
        } 
         
        private function playMP3(mp3:String):void 
        { 
            try 
            { 
                myMP3.load(new URLRequest(mp3)); 
                myMP3.play(); 
            } 
            catch (err:Error) 
            { 
                trace(err.message); 
                // your error-handling code here 
            } 
            myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
        } 
 
        private function linkHandler(linkEvent:TextEvent):void 
        { 
            playMP3(linkEvent.text); 
            // your error-handling code here 
        } 
         
        private function errorHandler(errorEvent:IOErrorEvent):void 
        { 
            trace(errorEvent.text); 
            // your error-handling code here 
        } 
    } 
}

處理狀態變更事件

Flash 執行階段會針對支援 level 屬性的類別,動態變更 netStatus.info.levelstatus.level 屬性的值。具有 netStatus.info.level 屬性的類別包括 NetConnection、NetStream 和 SharedObject。具有 status.level 屬性的類別則包括 HTTPStatusEvent、Camera、Microphone 和 LocalConnection。您可以撰寫處理常式函數,以回應 level 值的變更並追蹤通訊錯誤。

下列範例會使用 netStatusHandler() 函數來測試 level 屬性的值。如果 level 屬性指出遇到了錯誤,程式碼便會追蹤訊息「視訊串流已失敗」。

package 
{ 
    import flash.display.Sprite; 
    import flash.events.NetStatusEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
 
    public class VideoExample extends Sprite 
    { 
        private var videoUrl:String = "Video.flv"; 
        private var connection:NetConnection; 
        private var stream:NetStream; 
 
        public function VideoExample() 
        { 
            connection = new NetConnection(); 
            connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
            connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
            connection.connect(null); 
        } 
 
        private function netStatusHandler(event:NetStatusEvent):void 
        { 
            if (event.info.level == "error") 
            { 
                trace("Video stream failed") 
            } 
            else  
            { 
                connectStream(); 
            } 
        } 
 
        private function securityErrorHandler(event:SecurityErrorEvent):void 
        { 
            trace("securityErrorHandler: " + event); 
        } 
 
        private function connectStream():void 
        { 
            var stream:NetStream = new NetStream(connection); 
            var video:Video = new Video(); 
            video.attachNetStream(stream); 
            stream.play(videoUrl); 
            addChild(video); 
        } 
    } 
}