エラーイベントおよびステータスへの応答

Flash Player 9 以降、Adobe AIR 1.0 以降

ActionScript 3.0 のエラー処理で向上した最も重要な機能の 1 つは、アプリケーションの実行中に非同期のランタイムエラーに応答するためのエラーイベント処理のサポートです。非同期エラーの定義について詳しくは、 エラーの種類 を参照してください。

エラーイベントに応答するためにイベントリスナーとイベントハンドラーを作成することができます。 多くのクラスが、他のイベントの送出時と同じ方法でエラーイベントを送出します。 例えば、XMLSocket クラスのインスタンスは通常、3 種類のイベント( Event.CLOSE Event.CONNECT および DataEvent.DATA )を送出します。ただし、問題が発生した場合には、XMLSocket クラスは IOErrorEvent.IOError または SecurityErrorEvent.SECURITY_ERROR を送出できます。イベントリスナーとイベントハンドラーについて詳しくは、 イベント処理 を参照してください。

エラーイベントは、次の 2 つのカテゴリのいずれかに該当します。

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