响应错误事件和状态

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

在 ActionScript 3.0 中,对错误处理最为明显的一项改进就是支持对应用程序运行时出现的异步错误予以响应。(有关异步错误的定义,请参阅错误类型。)

可以创建事件侦听器和事件处理函数来响应错误事件。对于许多类来说,它们调度错误事件的方式与调度其他事件的方式相同。例如,一般情况下,XMLSocket 类实例调度三种类型的事件:Event.CLOSEEvent.CONNECTDataEvent.DATA。但是,当发生问题时,XMLSocket 类还可以调度 IOErrorEvent.IOErrorSecurityErrorEvent.SECURITY_ERROR。有关事件侦听器和事件处理函数的详细信息,请参阅处理事件

错误事件分为两类:

  • 扩展 ErrorEvent 类的错误事件

    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 
        } 
    } 
}

使用状态更改事件

对于支持 level 属性的类,Flash 运行时会在应用程序运行时动态更改 netStatus.info.levelstatus.level 属性的值。具有 netStatus.info.level 属性的类有 NetConnection、NetStream 和 SharedObject。具有 status.level 属性的类有 HTTPStatusEvent、Camera、Microphone 和 LocalConnection。可以编写一个处理函数来响应 level 值的更改并跟踪通信错误。

以下示例使用 netStatusHandler() 函数测试 level 属性的值。如果 level 属性指示遇到错误,该代码将跟踪消息“Video stream failed”(视频流失败)。

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); 
        } 
    } 
}