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 런타임의 디버거 버전을 사용하는 경우에는 런타임에 대화 상자가 표시되어 플레이어에서 발생하는 리스너 함수가 없는 모든 오류 이벤트를 알립니다.
-
상태 기반 오류 이벤트
상태 기반 오류 이벤트는 네트워킹 및 통신 클래스의
netStatus
및
status
속성과 관련됩니다. 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);
}
}
}
|
|
|