Имеется loader.swf и file.swf. Первый загружает второй.
В loader следующий Document class, стандартно:
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.net.URLRequest;
public class FileLoader extends Sprite {
public function FileLoader() {
super();
var loader:Loader = new Loader();
loader.load(new URLRequest('file.swf'));
}
}
}
В file:
package {
import flash.display.Sprite;
public class File extends Sprite {
public function File() {
super();
throw new Error('Some error');
}
}
}
Вопрос: как отловить Some error в конструкторе File и при этом не
поломать все приложение?
Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://www.timezero.com/
Но может кто-то и нашел какое-то решение.
Если бы мне это было нужно, я бы попробовал копать в следующем
направлении. Например разработчики фреймворка Mate, если я не
ошибаюсь, применяют паттерн инверсии управления (Inversion of Control)
и паттерн внедрения зависимостей (Depenedency Injection).
(термины, введенны Мартином Фаулером, Родом Джонсоном и группой
программистов PicoContainer в 2003 г.)
Ну и такая характерная цитата:
"Method Injection это форма IoC в которой контейнер реализует
абстрактный метод или переопределяет существующий метод для
установления зависимости. Это более редкая форма по сравнению с
Dependency Injection через свойства или конструктор."
- Оч. возможно что в таком фреймворке - можно было бы перехватывать
гораздо больше исключений/ошибок, чем обычно.
--
Евгений Н.
> может какнибудь так прокатит:
File — рутовый класс file.swf, а не класс в либе. Он и выкидывает
исключение в конструкторе.
> или что ты имееншь под словами "не поломать все приложение" ?
Перестает работать загрузка такого файла, никаких событий после
исключения не происходит.
Нет. swf произвольный, с некоторым набором ресурсов.
Flop Serg, нету такой возможности.
и всё таки ответьте причём тут АппДомен?
к тому же конструктор ничего заметить не может. на то он и конструктор.
--~--~---------~--~----~------------~-------~--~----~
Dima Kruk, а проверить?
очевидно:)) =>> отлавливать его нужно при
> вызове load! (это мое предположение)
Предположение неверное, потому как сам по себе load не вызывает
ошибок, а вызов конструктора происходит в некоторый, недоступный для
нас момент времени.
Пока придумано решение с генерацией нового рутового класса для
загружаемого swf на лету, в событии progress. Даже успешно проведен тест.
понадобиться? Главный класс является
точкой входа, зачем в нем делать
исключения?
> в таких случаях вместо ошибки должно диспатчиться событие ErrorEvent
> а если в конструкторе генерится исключение - то тут ничего нельзя предпринять
Это понятно, но эту ошибку создал не я, а она сама возникла, даже
банальный super.stage.addEventListener в конструкторе создаст
исключение, хотя сама по себе флешка работает, но будучи
загруженной, может выкидывать исключения.
> Главный класс является
> точкой входа, зачем в нем делать
> исключения?
Исключения не мои, вот такой вот swf.
Пока придумано решение с генерацией нового рутового класса для
загружаемого swf на лету, в событии progress. Даже успешно проведен тест.
> а расскажи как это?
Ну примерно так: загружаем swf, в PROGRESS обрабатываем бинарник,
ищем тег SymbolClass, получаем имя класса, генерируем по бинарному
шаблону новый swf с зашитым в него нашим классом, загружаем его через loadBytes в тот же
ApplicationDomain, что и у загружаемого swf. В итоге loadBytes
срабатывает раньше какой-либо инициализации загруженного swf и наш
класс замещает рутовый класс загружаемого swf.
Ну примерно так: загружаем swf, в PROGRESS обрабатываем бинарник,
ищем тег SymbolClass, получаем имя класса, генерируем по бинарному
шаблону новый swf с зашитым в него нашим классом, загружаем его через loadBytes в тот же
ApplicationDomain, что и у загружаемого swf. В итоге loadBytes
срабатывает раньше какой-либо инициализации загруженного swf и наш
класс замещает рутовый класс загружаемого swf.
> а весь код из документ класса загружаемой теряется в нибытье ?
Совершенно верно. Но он и не нужен, нужны ресурсы из такой либы.
> Господа вы друг-другу противоречите ))
> Позвольте полюбопытствовать, когда у вас получится сие чудо, оно будет доступно общественности?
Чудо случилось, но не до конца, BlooDHounD хотел сохранить
работоспособность исходного рутового класса, создавая его позже,
через try catch, чтобы иметь возможность контролировать конструктор.
Но у нас не получилось достать исходный рутовый класс из
ApplicationDomain обратно, только заменить на свой.
Я не уверен, что общественности это вообще нужно.
Зато выяснилось, что на свойство bytes у LoaderInfo не действует
кроссдоменная политика и таким образом, используя все тот же loadBytes,
можно обойти ограничения security. Например, загрузить картинку,
отобразить, исказить и вообще как угодно извратиться. Про swf вообще
можно и не говорить даже.
--
ign
_____________________________________________________________________
http://www.isky.ru
> Что это за свойство такое волшебное bytes у экземпляра класса LoaderInfo ?
А в документации информации о нем нету, разве? Поставьте флеш
поновее ;-)
у меня в методе onLoadComplete
вот эта строчка кода:
trace(loader.loaderInfo['bytes']);
выкидывает Error #1009: Cannot access a property or method of a null
object reference.
> Мы о 9-ом флеш плеере говорим?
Безусловно. С версии 9.0.45.0, если не ошибаюсь, появилось это
свойство. А у вас, похоже, CS3 ещё с версией 9.0.16.0 или какая там
была…
Собственно, в документации оно есть:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/LoaderInfo.html
Зато выяснилось, что на свойство bytes у LoaderInfo не действует
кроссдоменная политика и таким образом, используя все тот же loadBytes,
можно обойти ограничения security. Например, загрузить картинку,
отобразить, исказить и вообще как угодно извратиться. Про swf вообще
можно и не говорить даже.
Ммммм, продолжите мысль.
Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://timezero.com/
ign
_____________________________________________________________________
http://www.isky.ru
> Либо у меня глюки, либо экземпляр класса Loader теперь можно на сцену
> добавить после загрузки. Даже если он из другого домена грузил. Но
> сделать с ним ничего потом нельзя.
А вы внимательно прочитайте, о чем именно я писал.
> > А вы внимательно прочитайте, о чем именно я писал.
> >
> Это в дополнение к вышесказанному. Раньше добавить лоадер на сцену
> нельзя было.
Киньте ссылкой, где написано что нельзя или нельзя было.
Сколько я помню AS3, flash.display.Loader всегда наследовался от
DisplayObject и всегда его можно было добавить на сцену, не зависимо
от тоого, загружен в него контент или нет(и не важно из какого
домена).
--
Oleg Galaburda
http://blog.actualwave.com/
Advanced Flash Components / CrabDish LLC
7350 E. Progress Place, Suite 212
Greenwood Village, CO 80111
USA
Каких эвентов? У нас вываливается runtime-
error, его нужно перехватить.
События тут причем?
Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://timezero.com/
Если вы знакомы со спецификацией SWF, быть может поможет:
Пропарсить ByteArray, найти тэг DoABC, пробежаться по нему и найти нужный method_body_info для соответствующего $iinit-а (конструктора у проблеммного класса), а затем добавить туда exception_info, натянутый от самого начала и до конца, плюс некий рукотворный отсылатель ошибки, наверное разумнее событием. Должно сработать, как мне кажется.