попробуй поймать не работает? - PullRequest
2 голосов
/ 01 апреля 2009

Я использую блок try-catch в следующем коде Actionscript 3:

try {
    this._subtitle = new SubtitleController(subtitlePath, _framerate);
    this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded);
}
catch (e:Error) {
    trace('subtitle not found');
}

Конструктор SubtitleController затем пытается загрузить subtitlePath и выдает Error #2044: Unhandled ioError, но ошибка не фиксируется оператором try. Ошибка просто выдается, как будто не существовало никакого оператора try.

Конечно, я могу заменить этот код на

this._subtitle.addEventListener(IOErrorEvent.IO_ERROR, function (ev:Event) { trace('subtitle not loaded'); });
this._subtitle = new SubtitleController(subtitlePath, _framerate);
this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded);

и он почти работает, он перестает выдавать эту ошибку, но вместо этого выдает другую.

Но разве не в этом смысл try-catch блоков? Почему он не работает с try-catch, но работает с обычным прослушивателем событий?

Ответы [ 3 ]

7 голосов
/ 01 апреля 2009

IOErrors / NetworkErrors - это асинхронные ошибки. Они не генерируются, когда вызывающий их метод вызывается как обычные ошибки времени выполнения. В противном случае выполнение пришлось бы полностью остановить, пока (например) файл не будет полностью загружен ...

6 голосов
/ 01 апреля 2009

В основном, поскольку вызов асинхронный, попробуй .. поймай..финал блок не сделаешь бобы немного хорошего. Требуется время для загрузчика, чтобы определить URL плохо, а затем отправляет IO_ERROR событие. - http://www.mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

Тео верен; Я бы просто добавил, чтобы использовать класс IOErrorEvent пакета flash.events, чтобы справиться с этим для тех, кто не знает метод.

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("test.mp3"));
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
function onIOError(e:IOErrorEvent):void
{
    trace("An IO Error has occured.\n\n", e);
}

Если вы работаете с объектом Loader, а не с URLLoader, помните, что вам необходимо прослушивать свойство contentLoaderInfo объекта Loader следующим образом.

var loader:Loader = new Loader();
addChild(loader);

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(new URLRequest("path/to/asset"));

function onIOError(e:IOErrorEvent):void
{
    trace("An IO Error has occured.\n\n", e);
}
0 голосов
/ 11 ноября 2013

Сегодня я обнаружил, что иметь класс с именем log.as - плохая идея. Ошибки, выбрасываемые из этого класса, не попадают в попытку.

Я думаю, что они были в порядке раньше. Я использую FlexUnit с юнит-тестами, которые ожидают ошибок. У меня установлен AIR SDK 2.7 и недавно добавлен AIR SDK 2.01 (для другого проекта), который мог инициировать конфликт.

Может быть, это угловой случай старых SDK или что-то конкретное в моей среде сборки.

Переименование класса решило проблему для меня.

...