エラーイベントおよびステータスへの応答
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);
}
}
}
|
|
|