오류 이벤트 및 상태에 응답

Flash Player 9 이상, Adobe AIR 1.0 이상

ActionScript 3.0 오류 처리에서 가장 주목할 만한 개선 사항 중 하나는 응용 프로그램이 실행되는 동안 비동기 오류에 응답하기 위한 오류 이벤트 처리가 지원된다는 것입니다. 비동기 오류에 대한 정의는 오류 유형을 참조하십시오.

이벤트 리스너 및 이벤트 핸들러를 만들어 오류 이벤트에 응답할 수 있습니다. 많은 클래스에서 다른 이벤트를 전달하는 것과 같은 방식으로 오류 이벤트를 전달합니다. 예를 들어 XMLSocket 클래스의 인스턴스는 일반적으로 Event.CLOSE, Event.CONNECT, DataEvent.DATA의 세 가지 유형의 이벤트를 전달합니다. 하지만 문제 발생 시 XMLSocket 클래스는 IOErrorEvent.IOError 또는 SecurityErrorEvent.SECURITY_ERROR를 전달할 수 있습니다. 이벤트 리스너 및 이벤트 핸들러에 대한 자세한 내용은 이벤트 처리를 참조하십시오.

오류 이벤트는 다음 두 범주 중 하나에 해당됩니다.

  • ErrorEvent 클래스를 확장하는 오류 이벤트

    flash.events.ErrorEvent 클래스에는 실행 중인 응용 프로그램의 네트워킹 및 통신 작업과 관련한 오류를 관리하기 위한 속성 및 메서드가 포함됩니다. AsyncErrorEvent, IOErrorEvent, SecurityErrorEvent 클래스는 ErrorEvent 클래스를 확장합니다. Flash 런타임의 디버거 버전을 사용하는 경우에는 런타임에 대화 상자가 표시되어 플레이어에서 발생하는 리스너 함수가 없는 모든 오류 이벤트를 알립니다.

  • 상태 기반 오류 이벤트

    상태 기반 오류 이벤트는 네트워킹 및 통신 클래스의 netStatusstatus 속성과 관련됩니다. Flash 런타임에서 데이터를 읽거나 쓸 때 문제가 발생하면 사용 중인 클래스 객체에 따라 netStatus.info.level 또는 status.level 속성의 값이 "error" 값으로 설정됩니다. 이벤트 핸들러 함수에서 level 속성에 "error" 값이 포함되었는지 여부를 확인하여 이 오류에 응답합니다.

오류 이벤트를 사용한 작업

ErrorEvent 클래스 및 그 하위 클래스에는 데이터를 읽거나 쓸 때 Flash 런타임에서 전달한 오류 처리를 위한 오류 유형이 포함됩니다.

다음 예제는 try..catch 문 및 오류 이벤트 핸들러를 모두 사용하여 로컬 파일을 읽으려고 할 때 감지된 모든 오류를 표시합니다. 보다 정교한 처리 코드를 추가하여 사용자에게 옵션을 제공하거나 "your error-handling code here" 주석이 표시된 위치에서 자동으로 오류를 처리할 수 있습니다.

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.level 또는 status.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); 
        } 
    } 
}