對錯誤事件和狀態做出回應
Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本
ActionScript 3.0 在錯誤處理方面最重要的一項改良,就是在應用程式執行時,支援對非同步執行階段錯誤回應的錯誤事件處理。(如需非同步錯誤的定義,請參閱
錯誤類型
)。
您可以建立事件偵聽程式與事件處理常式,回應錯誤事件。許多類別在傳送錯誤事件時,所採用的方式都和傳送其它事件相同。例如,XMLSocket 類別的實體通常會傳送三種類型的事件:
Event.CLOSE
、
Event.CONNECT
和
DataEvent.DATA
。然而,當問題發生時,XMLSocket 類別可以傳送
IOErrorEvent.IOError
或
SecurityErrorEvent.SECURITY_ERROR
。如需有關事件偵聽程式和事件處理常式的詳細資訊,請參閱
處理事件
。
錯誤事件可區分為下列兩種:
-
擴充 ErrorEvent 類別的 Error 事件
flash.events.ErrorEvent 類別所包含的屬性和方法,可以用來管理和網路及通訊作業有關的執行階段錯誤。AsyncErrorEvent、IOErrorEvent 和 SecurityErrorEvent 類別都會擴充 ErrorEvent 類別。如果您使用的是 Flash 執行階段除錯程式版本,則無須使用偵聽程式函數,在執行階段便會出現對話方塊,通知您播放程式所遇到的任何錯誤事件。
-
以狀態為架構的錯誤事件
以狀態為架構的錯誤事件和網路與通訊類別的
netStatus
及
status
屬性有關。如果 Flash 執行階段在讀取或寫入資料時遇到問題,
netStatus.info.level
或
status.level
屬性的值 (視您所使用的類別物件而定) 便會設定為
"error"
值。如果您要回應這個錯誤,請檢查事件處理常式函數中的
level
屬性是否包含
"error"
這個值。
處理錯誤事件
ErrorEvent 類別及其子類別所包含的錯誤類型,可用來處理 Flash 執行階段在嘗試讀取或寫入資料時所傳送的錯誤。
下列範例會使用
try..catch
陳述式和錯誤事件處理常式,顯示在嘗試讀取本機檔案時所偵測到的任何錯誤。您可以加入較複雜的處理程式碼,以便為使用者提供選項,或是在註解「您的錯誤處理程式碼在這裡」所指示的地方自動處理錯誤:
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);
}
}
}
|
|
|