Hata olaylarını ve durumunu yanıtlama

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

ActionScript 3.0'da hata işleme konusunda en dikkate değer iyileştirmelerden biri, bir uygulama çalışırken senkronize olmayan çalışma zamanı hatalarını yanıtlamak için hata olayı işleme desteğidir. (Eşzamansız hataların bir tanımı için, bkz. Hata türleri.)

Hata olaylarını yanıtlamak için olay dinleyicileri ve olay işleyicileri oluşturabilirsiniz. Sınıfların çoğu, diğer olayları gönderdikleri şekilde hata olaylarını da gönderir. Örneğin, XMLSocket sınıfının bir örneği normalde üç olay türü gönderir: Event.CLOSE, Event.CONNECT ve DataEvent.DATA. Ancak bir sorun oluştuğunda, XMLSocket sınıfı, IOErrorEvent.IOError veya SecurityErrorEvent.SECURITY_ERROR öğesini gönderebilir. Olay dinleyicileri ve olay işleyicileri hakkında daha fazla bilgi için, bkz. Olayları işleme.

Hata olayları, iki kategoriden birisine girer:

  • ErrorEvent sınıfını genişleten hata olayları

    flash.events.ErrorEvent sınıfı, çalışan bir uygulamada ağ iletişimi ve iletişim işlemleriyle ilgili çalışma zamanı hatalarının yönetilmesine yönelik özellikleri ve yöntemleri içerir. AsyncErrorEvent, IOErrorEvent ve SecurityErrorEvent sınıfları, ErrorEvent sınıfını genişletir. Bir Flash çalışma zamanının hata ayıklayıcı sürümünü kullanıyorsanız, bir iletişim kutusu, oynatıcının karşılaştığı dinleyici işlevleri olmadan çalışma zamanında hata olaylarını size bildirir.

  • Durum tabanlı hata olayları

    Durum tabanlı hata olayları, ağ iletişimi ve iletişim sınıflarının netStatus ve status özellikleriyle ilgilidir. Bir Flash çalışma zamanı, veri okurken ya da yazarken bir sorunla karşılaşırsa, netStatus.info.level veya status.level özelliklerinin değeri (kullandığınız sınıf nesnesine bağlı olarak), "error" değerine ayarlanır. level özelliğinin, olay işleyicisi işlevinizde "error" değerini içerip içermediğini kontrol ederek bu hatayı yanıtlarsınız.

Hata olaylarıyla çalışma

ErrorEvent sınıfı ve bu sınıfın alt sınıfları, veri okumaya veya yazmaya çalıştıkça, Flash çalışma zamanları tarafından gönderilen hataların işlenmesine yönelik hata türlerini içerir.

Aşağıdaki örnek, yerel bir dosya okunmaya çalışılırken algılanan hataları görüntülemek için, bir try..catch deyimini ve hata olayı işleyicilerini kullanır. Kullanıcıya seçenekler sağlamak için daha gelişmiş işleme kodu ekleyebilir veya “your error-handling code here”: yorumunun belirttiği yerde otomatik olarak hatayı işleyebilirsiniz.

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 
        } 
    } 
}

Durum değişikliği olaylarıyla çalışma

Flash çalışma zamanları bir uygulama çalışırken level özelliğini destekleyen sınıflara ilişkin netStatus.info.level veya status.level özelliklerinin değerini dinamik olarak değiştirir. netStatus.info.level özelliğine sahip sınıflar, NetConnection, NetStream ve SharedObject sınıflarıdır. status.level özelliğine sahip sınıflar, HTTPStatusEvent, Camera, Microphone ve LocalConnection sınıflarıdır. level değerindeki değişikliğe yanıt vermek ve iletişim hatalarını izlemek için bir işleyici işlevi yazabilirsiniz.

Aşağıdaki örnek, level özelliğinin değerini test etmek için bir netStatusHandler() işlevini kullanır. level özelliği bir hatayla karşılaşıldığını belirtirse, kod “Video stream failed” mesajını izler.

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); 
        } 
    } 
}