Svara på felhändelser och statusFlash Player 9 och senare, Adobe AIR 1.0 och senare En av de mest märkbara förbättringarna när det gäller felhantering i ActionScript 3.0 är stödet för felhändelsehantering för att svara på asynkrona fel som inträffar när ett program körs. (En definition av asynkrona fel finns i Olika typer av fel.) Du kan skapa händelseavlyssnare och händelsehanterare för att besvara felhändelser. I många klasser skickas felhändelser på samma sätt som andra händelser. En instans av exempelvis klassen XMLSocket skickar normalt tre typer av händelser: Event.CLOSE, Event.CONNECT och DataEvent.DATA. Om emellertid ett problem inträffar kan klassen XMLSocket skicka IOErrorEvent.IOError eller SecurityErrorEvent.SECURITY_ERROR. Mer information om händelseavlyssnare och händelsehanterare finns i Hantera händelser. Felhändelser passar in i en av dessa två kategorier:
Arbeta med felhändelserKlassen ErrorEvent och dess underklasser innehåller feltyper för hantering av fel som skickas av Flash-miljön vid skriv- och läsåtgärder. I följande exempel används både en try..catch-sats och felhändelsehanterare för att visa fel som upptäcks när ett försök görs att läsa en lokal fil. Du kan på de platser som markeras med kommentaren ”your error handling code here” lägga till en mer sofistikerad kod för att ge användarna flera alternativ eller möjlighet att välja att hantera felet automatiskt: 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 } } } Arbeta med statusförändringshändelserFlash-miljöer ändrar värdet på egenskapen netStatus.info.level eller status.level dynamiskt för de klasser som har stöd för egenskapen level när ett program körs. Klasser med egenskapen netStatus.info.level är NetConnection, NetStream och SharedObject. De klasser som innehåller egenskapen status.level är HTTPStatusEvent, Camera, Microphone och LocalConnection. Du kan skriva en hanterarfunktion för att besvara ändringar i level-värdet och för att spåra kommunikationsfel. I följande exempel används funktionen netStatusHandler() för att testa värdet för egenskapen level. Om egenskapen level indikerar att ett fel har inträffat kommer meddelandet ”Video stream failed” att spåras av koden. 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); } } } |
|