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

Flash Player 9 以降、Adobe AIR 1.0 以降

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

エラーイベントに応答するためにイベントリスナーとイベントハンドラーを作成することができます。 多くのクラスが、他のイベントの送出時と同じ方法でエラーイベントを送出します。 例えば、XMLSocket クラスのインスタンスは通常、3 種類のイベント(Event.CLOSEEvent.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); 
        } 
    } 
}