[AS3] Отлов ошибки в загруженном swf

113 views
Skip to first unread message

Denis Kolyako

unread,
Aug 14, 2008, 3:59:49 AM8/14/08
to ruFlash
Здравствуйте, ruFlash.

Имеется 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/

Flop Serg

unread,
Aug 14, 2008, 4:20:33 AM8/14/08
to ruF...@googlegroups.com

может какнибудь так прокатит:

fileAD:ApplicationDomain = new ApplicationDmain();
 loader.load(new URLRequest('file.swf'),new LoaderContext(true,fileAD)); 
...
loadCompleteHandler(e:Event = null):void {
  try {
    var myFileClass:Class = fileAD.getDefinition("File") as Class;
  } catch (e:Error) { .... }
  try {
    var file:Sprite = new myFileClass() as Sprite;
  } catch (e:Error) { ...}
}

или что ты имееншь под словами "не поломать все приложение" ?

Евгений Н.

unread,
Aug 14, 2008, 4:37:15 AM8/14/08
to Denis Kolyako
Вопрос поднимался примерно год назад (если не путаю приват с
конференцией), вроде в ActionScript - не возможно.

Но может кто-то и нашел какое-то решение.


Если бы мне это было нужно, я бы попробовал копать в следующем
направлении. Например разработчики фреймворка Mate, если я не
ошибаюсь, применяют паттерн инверсии управления (Inversion of Control)
и паттерн внедрения зависимостей (Depenedency Injection).

(термины, введенны Мартином Фаулером, Родом Джонсоном и группой
программистов PicoContainer в 2003 г.)

Ну и такая характерная цитата:

"Method Injection это форма IoC в которой контейнер реализует
абстрактный метод или переопределяет существующий метод для
установления зависимости. Это более редкая форма по сравнению с
Dependency Injection через свойства или конструктор."

- Оч. возможно что в таком фреймворке - можно было бы перехватывать
гораздо больше исключений/ошибок, чем обычно.


--
Евгений Н.

Denis Kolyako

unread,
Aug 14, 2008, 4:41:05 AM8/14/08
to Flop Serg
Здравствуйте, Flop.

> может какнибудь так прокатит:

File — рутовый класс file.swf, а не класс в либе. Он и выкидывает
исключение в конструкторе.

> или что ты имееншь под словами "не поломать все приложение" ?

Перестает работать загрузка такого файла, никаких событий после
исключения не происходит.

BlooDHounD

unread,
Aug 14, 2008, 4:47:41 AM8/14/08
to ruFlash
Уважаемый Евгений Н.

скажите мне пожалуйста, как хоть какой-нить паттерн, сможет исправить
подобную ситуацию?

как с отловом ошибки в загружаемой флэшке связаны такие умные слова,
как "Фаулер", "Мате", "Inversion of Control", "Depenedency Injection",
и вся остальная бредятина, которую Вы описали?

Flop Serg

unread,
Aug 14, 2008, 4:53:41 AM8/14/08
to ruF...@googlegroups.com
а есть ли возможность написать свой класс File
в котором весь конструктор был-бы вынесен в отдельный метод?
тогда загрузить его раньше в новый АппДомен потом туда-же file.swf
после загрузки вызвать свой метод заменяющий конструктор

Denis Kolyako

unread,
Aug 14, 2008, 5:03:11 AM8/14/08
to Flop Serg
Здравствуйте, Flop.

Нет. swf произвольный, с некоторым набором ресурсов.

BlooDHounD

unread,
Aug 14, 2008, 5:07:40 AM8/14/08
to ruFlash
Flop Serg, нету такой возможности.

и всё таки ответьте причём тут АппДомен?
к тому же конструктор ничего заметить не может. на то он и конструктор.

Flop Serg

unread,
Aug 14, 2008, 5:19:38 AM8/14/08
to ruF...@googlegroups.com


14 августа 2008 г. 12:07 пользователь BlooDHounD <mry...@gmail.com> написал:
Flop Serg, нету такой возможности.

и всё таки ответьте причём тут АппДомен?
к тому же конструктор ничего заметить не может. на то он и конструктор.
--~--~---------~--~----~------------~-------~--~----~

можно заменить целый класс своим, подобным исходному по функционалу, только без ошибки
для этого какраз и нужен АппДомен : в новый домен загружаем "свой хороший" класс, потом туда-же свф с "плохим" классом
и тот "плохой" класс заменится "своим хорошим". Проверено - работает

но не в этом случае
 > [swf произвольный, с некоторым набором ресурсов.]

BlooDHounD

unread,
Aug 14, 2008, 5:56:40 AM8/14/08
to ruFlash
> но не в этом случае
в этом тоже. только не успеем. loadBytes тоже асинхронный.

Dima Kruk

unread,
Aug 14, 2008, 5:57:10 AM8/14/08
to ruF...@googlegroups.com
> Вопрос: как отловить Some error в
> конструкторе File и при этом не
> поломать все приложение?

В любом случае тебе нужно использовать
конструкцию try catch!
Вызов исключения будет происходить
при вызове конструктора (это конечно
очевидно:)) => отлавливать его нужно при
вызове load! (это мое предположение)

BlooDHounD

unread,
Aug 14, 2008, 6:11:21 AM8/14/08
to ruFlash
Dima Kruk, а проверить?

Flop Serg

unread,
Aug 14, 2008, 6:14:21 AM8/14/08
to ruF...@googlegroups.com



Dima Kruk, а проверить?

как всегда лень....
А тема между тем очень интересная
может в адоб написать чтоб они придумали еще один лоадер который не инстанциирует подгружаемую флешку сам, а только по запросу
может в 10ку успеют включить

BlooDHounD

unread,
Aug 14, 2008, 6:18:44 AM8/14/08
to ruFlash
Flop Serg, тут скорее достаточно события error, на подобие событий
ioError и securityError. если не подписываешься, то исключение
генерится, а если подписываешься, то оно работает как try ...
catch ... finally

Denis Kolyako

unread,
Aug 14, 2008, 6:27:56 AM8/14/08
to Dima Kruk
Здравствуйте, Dima.

очевидно:)) =>> отлавливать его нужно при
> вызове load! (это мое предположение)

Предположение неверное, потому как сам по себе load не вызывает
ошибок, а вызов конструктора происходит в некоторый, недоступный для
нас момент времени.

Пока придумано решение с генерацией нового рутового класса для
загружаемого swf на лету, в событии progress. Даже успешно проведен тест.

whitered

unread,
Aug 14, 2008, 6:31:45 AM8/14/08
to ruF...@googlegroups.com
вообще то ни в каких нативных классах флеша не создаются ошибки в асинхронных методах. в данном случае вызов конструктора происходит по некоторому событию, поэтому вообще неправилен подход с созданием ошибки. в таких случаях вместо ошибки должно диспатчиться событие ErrorEvent
а если в конструкторе генерится исключение - то тут ничего нельзя предпринять

--
dmitry zhelnin

Dima Kruk

unread,
Aug 14, 2008, 6:31:37 AM8/14/08
to ruF...@googlegroups.com

> очевидно:)) =>> отлавливать его нужно
> при
>> вызове load! (это мое предположение)
>
> Предположение неверное, потому как
> сам по себе load не вызывает
> ошибок, а вызов конструктора
> происходит в некоторый, недоступный
> для
> нас момент времени.
>
Согласен, поторопился:)
Но вообще странно для чего такое может
понадобиться? Главный класс является
точкой входа, зачем в нем делать
исключения?

whitered

unread,
Aug 14, 2008, 6:32:55 AM8/14/08
to ruF...@googlegroups.com
не всегда исключения делаются преднамеренно )


понадобиться? Главный класс является
точкой входа, зачем в нем делать
исключения?

--
dmitry zhelnin

Denis Kolyako

unread,
Aug 14, 2008, 6:51:36 AM8/14/08
to whitered
Здравствуйте, whitered.

> в таких случаях вместо ошибки должно диспатчиться событие ErrorEvent
> а если в конструкторе генерится исключение - то тут ничего нельзя предпринять

Это понятно, но эту ошибку создал не я, а она сама возникла, даже
банальный super.stage.addEventListener в конструкторе создаст
исключение, хотя сама по себе флешка работает, но будучи
загруженной, может выкидывать исключения.

Denis Kolyako

unread,
Aug 14, 2008, 6:52:37 AM8/14/08
to Dima Kruk
Здравствуйте, Dima.

> Главный класс является
> точкой входа, зачем в нем делать
> исключения?

Исключения не мои, вот такой вот swf.

Flop Serg

unread,
Aug 14, 2008, 7:11:50 AM8/14/08
to ruF...@googlegroups.com

 Пока придумано решение с генерацией нового рутового класса для
 загружаемого swf на лету, в событии progress. Даже успешно проведен тест.


ого о_О
а расскажи как это?

Denis Kolyako

unread,
Aug 14, 2008, 7:29:57 AM8/14/08
to Flop Serg
Здравствуйте, Flop.

> а расскажи как это?

Ну примерно так: загружаем swf, в PROGRESS обрабатываем бинарник,
ищем тег SymbolClass, получаем имя класса, генерируем по бинарному
шаблону новый swf с зашитым в него нашим классом, загружаем его через loadBytes в тот же
ApplicationDomain, что и у загружаемого swf. В итоге loadBytes
срабатывает раньше какой-либо инициализации загруженного swf и наш
класс замещает рутовый класс загружаемого swf.

Flop Serg

unread,
Aug 14, 2008, 8:23:05 AM8/14/08
to ruF...@googlegroups.com


 Ну примерно так: загружаем swf, в PROGRESS обрабатываем бинарник,
 ищем тег SymbolClass, получаем имя класса, генерируем по бинарному
 шаблону новый swf с зашитым в него нашим классом, загружаем его через loadBytes в тот же
 ApplicationDomain, что и у загружаемого swf. В итоге loadBytes
 срабатывает раньше какой-либо инициализации загруженного swf и наш
 класс замещает рутовый класс загружаемого swf.

а весь код из документ класса загружаемой теряется в нибытье ?

Denis Kolyako

unread,
Aug 14, 2008, 8:39:53 AM8/14/08
to Flop Serg
Здравствуйте, Flop.

> а весь код из документ класса загружаемой теряется в нибытье ?

Совершенно верно. Но он и не нужен, нужны ресурсы из такой либы.

BlooDHounD

unread,
Aug 14, 2008, 8:40:52 AM8/14/08
to ruFlash
нет :) внутри класса заменты ставит try catch и создается реальный
класс, а заглушка удаляется.

Flop Serg

unread,
Aug 14, 2008, 9:28:25 AM8/14/08
to ruF...@googlegroups.com

Господа вы друг-другу противоречите ))
Позвольте полюбопытствовать, когда у вас получится сие чудо, оно будет доступно общественности?

[offtop]
Ура!!! свершилось чудо... когда я тут интерисовался есть ли возможность приаттачить байтАррэй
все гордо промолчали... и только сейчас Денис Коляко проболтался что есть такая штука как Loader.loadBytes
а я (лох) не не знал этого. и не мог внятно объяснить что же мне надо
За что ему громадный респект и уважуха
[/offtop]

Denis Kolyako

unread,
Aug 14, 2008, 9:40:36 AM8/14/08
to Flop Serg
Здравствуйте, Flop.

> Господа вы друг-другу противоречите ))
> Позвольте полюбопытствовать, когда у вас получится сие чудо, оно будет доступно общественности?

Чудо случилось, но не до конца, BlooDHounD хотел сохранить
работоспособность исходного рутового класса, создавая его позже,
через try catch, чтобы иметь возможность контролировать конструктор.
Но у нас не получилось достать исходный рутовый класс из
ApplicationDomain обратно, только заменить на свой.
Я не уверен, что общественности это вообще нужно.

Зато выяснилось, что на свойство bytes у LoaderInfo не действует
кроссдоменная политика и таким образом, используя все тот же loadBytes,
можно обойти ограничения security. Например, загрузить картинку,
отобразить, исказить и вообще как угодно извратиться. Про swf вообще
можно и не говорить даже.

ign

unread,
Aug 14, 2008, 10:00:30 AM8/14/08
to ruF...@googlegroups.com

> Зато выяснилось, что на свойство bytes у LoaderInfo не действует
> кроссдоменная политика и таким образом, используя все тот же loadBytes,
> можно обойти ограничения security.
>
Что это за свойство такое волшебное bytes у экземпляра класса LoaderInfo ?

--
ign
_____________________________________________________________________
http://www.isky.ru

Denis Kolyako

unread,
Aug 14, 2008, 10:02:51 AM8/14/08
to ign
Здравствуйте, ign.

> Что это за свойство такое волшебное bytes у экземпляра класса LoaderInfo ?

А в документации информации о нем нету, разве? Поставьте флеш
поновее ;-)

ign

unread,
Aug 14, 2008, 10:15:23 AM8/14/08
to ruF...@googlegroups.com

> А в документации информации о нем нету, разве? Поставьте флеш
> поновее ;-)
> --------~--~----~------------~-------~--~----~
>
Мы о 9-ом флеш плеере говорим?

у меня в методе onLoadComplete
вот эта строчка кода:
trace(loader.loaderInfo['bytes']);
выкидывает Error #1009: Cannot access a property or method of a null
object reference.

Denis Kolyako

unread,
Aug 14, 2008, 10:19:21 AM8/14/08
to ign
Здравствуйте, ign.

> Мы о 9-ом флеш плеере говорим?

Безусловно. С версии 9.0.45.0, если не ошибаюсь, появилось это
свойство. А у вас, похоже, CS3 ещё с версией 9.0.16.0 или какая там
была…

Собственно, в документации оно есть:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/LoaderInfo.html

Flop Serg

unread,
Aug 14, 2008, 10:30:14 AM8/14/08
to ruF...@googlegroups.com


 Зато выяснилось, что на свойство bytes у LoaderInfo не действует
 кроссдоменная политика и таким образом, используя все тот же loadBytes,
 можно обойти ограничения security. Например, загрузить картинку,
 отобразить, исказить и вообще как угодно извратиться. Про swf вообще
 можно и не говорить даже.

Да вся эта кросдоменная политика чушь полнейшая ИМХО
вся она на ура обходится одним небольшим скриптиком на своем сервере
и ничего тут не поделаешь (за исключением сокет соединений тут надо скриптик побольше)
помоему луше бы адобы рыли в сторону цифровых подписей и SSL

WyBaeB

unread,
Aug 14, 2008, 3:57:40 PM8/14/08
to ruFlash
Proxy class?

Denis Kolyako

unread,
Aug 14, 2008, 4:16:32 PM8/14/08
to ruF...@googlegroups.com

> Proxy class?

Ммммм, продолжите мысль.


Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://timezero.com/


ign

unread,
Aug 15, 2000, 8:38:33 AM8/15/00
to ruF...@googlegroups.com

> Зато выяснилось, что на свойство bytes у LoaderInfo не действует
> кроссдоменная политика и таким образом, используя все тот же loadBytes,
> можно обойти ограничения security. Например, загрузить картинку,
> отобразить, исказить и вообще как угодно извратиться. Про swf вообще
> можно и не говорить даже.
>
Либо у меня глюки, либо экземпляр класса Loader теперь можно на сцену
добавить после загрузки. Даже если он из другого домена грузил. Но
сделать с ним ничего потом нельзя.


ign
_____________________________________________________________________
http://www.isky.ru

Denis Kolyako

unread,
Aug 15, 2008, 8:41:46 AM8/15/08
to ign
Здравствуйте, ign.

> Либо у меня глюки, либо экземпляр класса Loader теперь можно на сцену
> добавить после загрузки. Даже если он из другого домена грузил. Но
> сделать с ним ничего потом нельзя.

А вы внимательно прочитайте, о чем именно я писал.

ign

unread,
Aug 15, 2008, 9:39:57 AM8/15/08
to ruF...@googlegroups.com

> А вы внимательно прочитайте, о чем именно я писал.
>
Это в дополнение к вышесказанному. Раньше добавить лоадер на сцену
нельзя было.

iFrame

unread,
Aug 23, 2008, 9:25:42 AM8/23/08
to ruF...@googlegroups.com
Здрасте!

> > А вы внимательно прочитайте, о чем именно я писал.
> >
> Это в дополнение к вышесказанному. Раньше добавить лоадер на сцену
> нельзя было.

Киньте ссылкой, где написано что нельзя или нельзя было.

Сколько я помню 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

303.694.9900
http://www.afcomponents.com

WyBaeB

unread,
Aug 26, 2008, 9:20:24 AM8/26/08
to ruFlash
Proxy class для евентов?

Denis Kolyako

unread,
Aug 26, 2008, 9:28:53 AM8/26/08
to ruF...@googlegroups.com
> Proxy class для евентов?

Каких эвентов? У нас вываливается runtime-
error, его нужно перехватить.
События тут причем?


Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://timezero.com/


Vasiliy Vasilyev

unread,
Aug 28, 2008, 6:01:17 PM8/28/08
to ruF...@googlegroups.com
­Если вы знакомы со спецификацией SWF, быть может поможет:
Пропарсить ByteArray, найти тэг DoABC, пробежаться по нему и найти нужный method_body_info для соответствующего $iinit-а (конструктора у проблеммного класса), а затем добавить туда exception_info, натянутый от самого начала и до конца, плюс некий рукотворный отсылатель ошибки, наверное разумнее событием. Должно сработать, как мне кажется.

Denis Kolyako

unread,
Aug 28, 2008, 6:43:41 PM8/28/08
to ruF...@googlegroups.com

Если вы знакомы со спецификацией SWF, быть может поможет:
Пропарсить ByteArray, найти тэг DoABC, пробежаться по нему и найти нужный method_body_info для соответствующего $iinit-а (конструктора у проблеммного класса), а затем добавить туда exception_info, натянутый от самого начала и до конца, плюс некий рукотворный отсылатель ошибки, наверное разумнее событием. Должно сработать, как мне кажется.


Со спецификацией знакомы. Интересный вариант, спасибо!
Reply all
Reply to author
Forward
0 new messages