Reagowanie na zdarzenia błędu i statusFlash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje Jednym z najbardziej zauważalnych udoskonaleń w obsłudze błędów w języku ActionScript 3.0 jest wsparcie obsługi zdarzenia błędu w celu reagowania na asynchroniczne błędy w czasie działania aplikacji. (Definicje asynchronicznych błędów zawiera sekcja Typy błędów). Programista może utworzyć detektory zdarzeń i moduły obsługi zdarzeń w celu reagowania na zdarzenia błędu. Wiele klas wywołuje zdarzenia błędu w ten sam sposób co inne zdarzenia. Na przykład: instancja klasy XMLSocket wywołuje zazwyczaj trzy zdarzenia: Event.CLOSE, Event.CONNECT i DataEvent.DATA. Jednak w chwili wystąpienia problem klasa XMLSocket może wywołać IOErrorEvent.IOError lub SecurityErrorEvent.SECURITY_ERROR. Więcej informacji o detektorach zdarzeń i modułach obsługi zdarzeń zawiera sekcja Obsługa zdarzeń. Zdarzenia Error można podzielić na dwie kategorie:
Praca ze zdarzeniami błęduKlasa ErrorEvent o raz jej podklasy zawierają typy błędów do obsługi błędów wywoływanych przez środowisko wykonawcze Flash podczas odczytu lub zapisu danych. W poniższym przykładzie użyta została instrukcja try..catch oraz moduły obsługi zdarzeń błędu do wyświetlania błędów wykrytych podczas próby odczytu lokalnego pliku. Bardziej wyrafinowany kod obsługi w celu zapewnienia użytkownikowi opcji wyboru lub innej automatycznej obsługi błędu można dodać w miejscu wskazywanym przez komentarz “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
}
}
}
Praca ze zdarzeniami zmiany statusuW trakcie wykonywania aplikacji środowiska wykonawcze Flash dynamicznie zmieniają wartość właściwości netStatus.info.level lub status.level klas obsługujących właściwość level. Klasami, które zawierają właściwość netStatus.info.level, są klasy NetConnection, NetStream i SharedObject. Klasami, które zawierają właściwość status.level są klasy HTTPStatusEvent, Camera, Microphone i LocalConnection. Można napisać funkcję modułu obsługi w celu reakcji na zmianę wartości właściwości level i śledzenia błędów komunikacji. Poniższy przykład używa funkcji netStatusHandler() do testowania wartości właściwości level. Jeśli właściwość level wskazuje, że napotkany został błąd, wyświetlony zostanie komunikat o niepowodzeniu przesyłania strumieniowego wideo. 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);
}
}
}
|
|