Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий
Одним из наиболее значительных улучшений обработки ошибок в ActionScript 3.0 является поддержка реагирования на асинхронные ошибки при выполнении программы. (Определение асинхронных ошибок см. в разделе
Типы ошибок
).
Для ответа на события ошибок можно создавать прослушивателей событий и обработчиков событий. Многие классы отправляют события ошибок тем же способом, что и другие события. Например, экземпляр класса XMLSocket при нормальных обстоятельствах отправляет события трех типов:
Event.CLOSE
,
Event.CONNECT
и
DataEvent.DATA
. Тем не менее, в случае возникновения проблемы класс XMLSocket может отправлять события
IOErrorEvent.IOError
или
SecurityErrorEvent.SECURITY_ERROR
. Дополнительные сведения о прослушивателях и обработчиках событий см. в разделе
Обработка событий
.
События ошибок подразделяются на две категории.
-
События ошибок, которые расширяют класс 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 динамически изменяют значение свойств
netStatus.info.level
или
status.level
для классов, поддерживающих свойство
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);
}
}
}
|
|
|