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:
-
Zdarzenia Error rozszerzające klasę ErrorEvent
Klasa flash.events.ErrorEvent zawiera właściwości i metody do zarządzania błędami czasu wykonywania powiązanymi z pracą w sieci oraz operacjami komunikacyjnymi w działającej aplikacji. Klasy AsyncErrorEvent, IOErrorEvent i SecurityErrorEvent rozszerzają klasę ErrorEvent. Podczas korzystania ze środowiska wykonawczego Flash w wersji z debugerem, w czasie wykonywania, zostanie wyświetlone okno dialogowe informujące o wszystkich zdarzeniach błędu bez funkcji detektorów, na które napotkał odtwarzacz.
-
Zdarzenia błędu oparte na statusie
Zdarzenia błędu oparte na statusie powiązane są z właściwościami
netStatus
i
status
klas dotyczących pracy w sieci i komunikacji. Jeśli środowisko wykonawcze Flash napotka na problem podczas odczytywania lub zapisywania danych, wartość właściwości
netStatus.info.level
lub
status.level
(w zależności od używanego obiektu klasy) ustawiane są na wartość
"error"
. Zareagować na ten błąd można przez sprawdzenie, czy właściwość
level
zawiera wartość
"error"
w funkcji modułu obsługi zdarzenia.
Praca ze zdarzeniami błędu
Klasa 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 statusu
W 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);
}
}
}
|
|
|