Flash Ripper RSS Readers

А что если отловить все ошибки в приложении одним махом?

Известно, что AS3 строже относится к ошибкам. Мелких ошибок тут нет: любое исключение может остановить работу приложения на любом этапе. Как пишет Dan: "... нам нужно исправлять эту маленькую кривость, которая превратилась в критическую ошибку: вставлять if или try..."

Также известно, что в ActionScript 3 ( Flash Player 9 / AVM2) блок try...catch...finally намного производительнее, чем в ActionScript 2.

В связи с этим пришла мне в голову крамольная мысль заключить в этот блок все приложение:

try {
creationCompleteHandler();
}
catch (e: Error) {
trace("Вы ошибаетесь, мой друг. " + e);
}

Это пример для Flash. Вопросы:

  1. Тем, кто уже это пробовал — помогает ли это избежать остановки AS3-приложения вообще (чтобы было, "как в AS2")?
    Ответ: не все так просто, детали в первом комменте. Кое-какие шансы есть, читайте все комментарии.
  2. Сильно ли это сказывается на производительности?
    Ответ: похоже, не сильно.

Update 1: Но должен быть способ продолжить работу после непойманой ошибки!

Update 2: Идем к решению прямым путем: в Adobe JIRA голосуем за исправление этого бага.

Update 3: Илья Панин в комментариях дает ссылку на вот такое решение для Flex.

Писал Rost, 28 Август 2008 17:39

Найдены баги:

Всё приложение не получится.
Пример:

try {
   button.addEventListener(MouseEvent.CLICK, handleClick);
} catch (e:Error) {
   trace("Вы ошибаетесь, мой друг! " + e);
}

"Ошибкоустойчивость" тут приобретёт только одна строчка - добавление лисенера.

Внутри функции handleClick у нас всё равно может родится unhandled exception, посколько действие try туда не распространяется.

Dan - 28 Август 2008 17:50

"Геморройный" способ: вставлять try...catch в каждую функцию. Или хотя бы в каждый обработчик события. Но придётся хорошо порабоать руками (или скриптик какой-нить написать).

"Правильный" способ (как оно и подразумевалось): добавлять try...catch только там, где действительно может есть риск возникновения эксешна. Хотя это это ещё сложнее, ибо придётся ещё головой думать, в отличии от предыдущего варианта, где требуется чисто механическая работа.

Dan - 28 Август 2008 18:17

А чего тут думать-то? Голосовать надо!

Вот здесь:
http://bugs.adobe.com/jira/browse/FP-444

mitek - 28 Август 2008 18:34

http://www.docsultant.com/site2/articles/flex_internals.html#uerror

// за линку спасибо Глабуде Олегу и чату

__i - 28 Август 2008 18:56

в джаве например try ... catch .. finally в каждом методе, это нормальная практика.

BlooDHounD - 28 Август 2008 19:08

вот отловить "такую" ошибку мы так и не смогли.

http://groups.google.com/group/ruFlash/browse_thread/thread/5b395b08549551b8/458398c9626a65db

BlooDHounD - 28 Август 2008 19:18

все точки входа в апп - конструктор главного спрайта + лисенеры, подписаные на евенты + колбеки с сервера.
Если так уж хочется отловить все ексепшены, то можна написать класс похожий на АС2 Delegate подписыватся на евенты и колбеки через него, а в нем поставить try catch блок. Этого вполне хватит, чтоб в случае ексепшена залогать его и показать модальное окно типа "случилась херня, рефрешните страницу".

Mokus - 28 Август 2008 23:49

Mokus, на мой взгляд возможность отлавливать все ошибки единым трайкэтч, это бред. а вот возможность отловить любую ошибку - это нужда.

BlooDHounD - 29 Август 2008 0:18

Во многих скриптовых языках есть возможность установить глобальный отловщик ошибок.
Для решения такой проблемы в AS3 могу порекомендовать такое решение:

1. В "самостоятельных" или "завершенных" до нужной степени местах пишем:

try {
...
} catch (error:Error) {
Exception.handle(this, error);
}

и не забываем про события-ошибки:

function on_error(event:ErrorEvent):void {
Exception.handleEvent(this, event);
}
...

2. А у Exception сделать метод setHandler( handler:IExceptionHandler ), в котором указываем кто именно будет принимать и обрабатывать ошибки, возможно даже и выводить alert-ы...

Vasiliy Vasilyev - 29 Август 2008 1:30

а Proxy заюзать для отлова никак не получится?

override flash_proxy function getProperty(name:*):* ...

Zzloba - 29 Август 2008 7:51

2 BlooDHounD:

возможность отловить все ексепшены - нужда. Насчет примера, что ты описал выше - сочувствую.

Отлавливать все ексепшены единственным трай кетчетм- бред, но никто этого не предлагал.

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

Mokus - 29 Август 2008 10:30

Mokus, ну блин :) если не отловил все баги, то это кривые руки разработчика.

Zzloba, причём тут прокси? вы с какой планеты?

BlooDHounD - 29 Август 2008 12:37

>Mokus, ну блин :) если не отловил все баги, то это кривые руки разработчика.

Mokus прав. Кривые или нет, это уже другая тема. (они у всех бывают кривыми время от времени, если хотите знать моё мнение. у вас ни разу не выпадало ошибок в ваших любимых программах? я вот что-то не припоминаю ни одной идеальной).

На мой взгляд, глобальный обработчик не имеет смысла. Если он или нет, нормальное течение программы прервано, программа попала в некорректное (неизвестное) состояние, и вернуть в нормальное состояние можно только переинициализацией.

Не проще ли приучить пользователей просто перегружать приложение во время ошибки? И без сообщения об этом?

Arsu - 29 Август 2008 13:54

Добавили бы обязательный 'throws' для определения метода, как в яве, вообще бы сказка была... Может предложить адобовцам?

E-Fir - 29 Август 2008 15:36

Ухх, сколько всего нового я узнал! Спасибо, друзья!

Рост - 29 Август 2008 16:31

2 Arsu: окно окном, а залогать баг надо. для того и обработчик.

2 BlooDHounD: ну... я думал почти так как ты пока не начал писать ммо.

Mokus - 29 Август 2008 16:50

throws не получится добавить для подписки на евенты. так же как в жаве throws ниче не решает когда вызываеш метод черезрефлекшены.
кроме того throws имхо параноя. я рад. что его в ас нету.

Mokus - 29 Август 2008 16:52

Mokus, бугага :) а какая разница что писать?

BlooDHounD - 29 Август 2008 17:42

Не проще ли приучить пользователей просто перегружать приложение во время ошибки? И без сообщения об этом?

Иногда приложение падает прямо при старте - перезапускай не перезапускай :)
Причём на машине разработчика-то всё работает прекрасно :)

Dan - 29 Август 2008 21:14

2 BlooDHounD: бугага, что ты такое спрашиваеш.

Mokus - 30 Август 2008 8:45

Mokus, мне просто непонятно, как зависит мышление, от того пишешь ты ММО, t4t, или cms.

BlooDHounD - 30 Август 2008 14:58

2 BlooDHounD: мышление не зависит. но мышление и не выкидывает ексепшены.

Mokus - 31 Август 2008 7:39

Mokus, ну тогда расшифруй:

2 BlooDHounD: ну... я думал почти так как ты пока не начал писать ммо.

BlooDHounD - 31 Август 2008 11:16

2 BlooDHounD:
1. Предотвратить все баги/ексепшены на этапе девелопмента не получается (по крайней мере у меня и всех девов, что я знаю) - все равно какието словит тестер (или девелопер когда тестает).
2. При разработке ммо некоторые баги/ексепшены репродюсятся только когда на локации больше Х (например больше 20) чаров и то в определенных условиях. Такие баги тестеры не словят - разве что есть возможность посадить Х тестеров.

Mokus - 31 Август 2008 11:56

а в двух словах: в ммо очень большой процент исключительных ситуаций, которые ты (девелопер) не сможеш воспроизвести.

Mokus - 31 Август 2008 11:59

Mokus, мдя ... сочувствую. тоесть у Вы считаете, что пункт "первый" не разработка? по второму Вы считаете, что плавающих багов не бывает в других приложениях? я 4 года занимаюсь ММО, я думаю, что я не тот, кому нужно рассказывать про 20 чаров :)

BlooDHounD - 4 Сентябрь 2008 1:24
Написать багрепорт:










Можно: a href target blockquote strike strong em code pre small img width height border


Запомнить тебя?






Это запись из категории 'AS3'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-34, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-54, Books-8, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-31, Community-114, Components-19, Contests-28, conventions-1, Cool-Job-6, Debug-21, Design-27, Development-84, EMO-1, Events-13, Extensions-2, FAQ-9, FDS-1, Flash and html-6, Flash Player-36, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-41, Flex 2-80, flex4-2, Flickr-1, FMS-1, FPUG-55, frameworks-1, Games-13, Good Job!-39, HaXe-15, Health-2, Humor-10, Ideas-13, IV-1, JavaScript-1, Job-29, JSFL-8, Links-2, Linux-2, Maps-1, Math-8, Money-11, music-1, MXML-1, Open Source-16, Optimization-3, parenting-2, Patterns-2, Personalities-27, Philosophy-1, Politics-1, Preloading-3, Productivity-10, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, sport-2, Strategy-122, Tamarin-2, Tools-113, Training-2, Trash-8, URAFPUG-14, Urgent-1, Usability-6, Video-6, VoIP-7, Wallop-1, Wishlist-2, XML-1, Архив всех записей (большой)

За последние месяцы:

Сен 2008: Конкурс футболок UAFPUG — всего 5 дней, Нужна помощь в вопросе «быть или не быть» по поводу Flex'а, весь Сен

Авг 2008: Flex Gangsta Rap Video WTF Bro?, 27 сентября — встреча UAFPUG во Львове и плюшки от Adobe, весь Авг

Июл 2008: Тенденции среди работодателей: Adobe Flex, Adobe AIR, Silverlight, Спорт спасет красоту, которая спасет мир!, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)