![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
|
Я задавал этот вопрос на двух ресурсах, но он до сих пор без ответа. Но, тем не менее, вопрос интересный. Изначально он касался JavaScript'а, но в целом эта тема так же актуальна и относительно ActionScript'а, я не раз задумывался над этим.
При синхронном выполнении кода исключения — очень удобный механизм обработки ошибок. Но в JavaScript и ActionScript очень много кода, выполняемого асинхронно. Часто для обработки ошибок в этом случае используются коллбэки, но по удобству такая методика не сравнится с исключениями, при которых стек вызовов самостоятельно раскручивается до места перехвата. Я долго и упорно искал что-то по теме обработки ошибок в JS при асинхронном выполнении, но находил только что-то вроде этого: try { helloWorld(); } catch (e) { alert(e.message); } function helloWorld() { throw new Error('Hello world!'); } Есть ли хорошие статьи по поводу обработки ошибок при асинхронном выполнении, особенно в JS или AS3? Может быть, существуют специфические паттерны или малоизвестные возможности этих языков? |
|
|||||
|
Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
|
Да, это базовое понятие программирования на AS. Но, по сути дела, это тот же коллбэк, который вызывается по событию. Но что делать потом?
Если бы событие могло всплывать по всему стеку вызовов, и генерироваться любым объектом, можно было бы кинуть кастомное событие. Но, насколько мне известно, это не так. Последний раз редактировалось Mirror13; 29.04.2012 в 20:33. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Приведите пример асинхронного стека.
try/catch/finally используется только в синхронном коде, незачем обвинять его в непригодности там, где он и не подписывался помогать. В асинхронном коде используются События, и другого инструмента, кроме естественного, нет. Асинхронные ошибки могут произойти после вызова асинхронных операций вроде загрузки, коих немного. Обычно (не уверен, что всегда, только потому, что не все еще во флэше перепробовал)) исполнители таких операций обещают сообщать об ошибках процесса, если это вообще возможно (если плеер вообще получает какую-то информацию от внешней среды, с которой взаимодействует в процессе асинхронной операции). Приведите конкретный пример, посмотрим.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
|
Я не совсем это имел в виду. Ясное дело, что try/catch не работает с асинхронными вызовами. Вопрос в том, есть ли способы сделать механизм для обработки ошибок при асинхронных вызовах, который был бы так же удобен, как исключения при синхронных.
Как пример можно привести обертку для запросов на сервер. Допустим, там есть метод: public function getData(resource:String, onSuccess:Function, onError:Function):void { _applyRequest(resource, URLRequestMethod.GET, onSuccess, onError); } loader.addEventListener(IOErrorEvent.IO_ERROR, onLoadError); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoadError); Вот если бы можно было избавиться от протягивания коллбэка onError, а как-то через весь стек передать сигнал. В синхронном случае это исключение. В случае экранных объектов можно использовать dispatchEvent. А можно ли что-нибудь придумать в этом случае? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Как может асинхронный быть таким же, как синхронный? Помните картинку популярную с кубиками, на которых написаны буквы "А","П","Ж" и "О", и "пока не соберешь слово СЧАСТЬЕ, домой не пойдешь"? Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
|
Ясно.
Я так понимаю, что для использования событий нужно, чтобы класс наследовался от EventDispatcher'а. В этом случае можно будет делать примерно так: И, соответственно: Но всплыть на несколько уровней вверх это событие не сможет, и перехватить его можно будет только на том уровне, где был создан serverDataInstance, я правильно понимаю? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да. Создаем объект и перед вызовом сомнительного метода подписываемся на событие об ошибке.
А зачем выше? Чтобы обрабатывать все в Едином Центре Ошибок в Мейне? То есть Мейну надо будет знать детали реализации своих неуравновешенных детишек?)) Честно сказать, тут я не советчик — никогда не пытался строить архитектуру таким образом. Мне кажется, что с ошибкой в результате выполнения метода должен разбираться тот, кто этот метод вызвал. Но если не так, то придется на этот раз ему отсылать событие наверх, дескать "шеф, усё пропало!" Знаю, знаю. Опять протягивание, опять многоступенчатая передача. Но на деле мне кажется это не так страшно, как кажется))))) Я бы даже сказал, что здесь больше гибкости и осмысленности, но нет, у меня недостаточно опыта в построении систем с синхронными ошибками, чтобы сравнивать. Цитата:
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: May 2010
Адрес: Ногинск
Сообщений: 56
|
Спасибо за информацию )
Цитата:
Но, видимо, не судьба ) Вряд ли самостоятельно реализовывать всплытие по всем уровням лучше, чем вызывать нужные коллбэки или передавать по всем уровням событие. Цитата:
Композиция - если я правильно понимаю, это иерархия объектов с одинаковым интерфейсом, в которых как раз реализована передача сообщений от нижнего уровне наверх. Как DOM в HTML или дерево экранных объектов во Flash'е. А мне было интересно, что делать в общем случае. Выходит, в месте непосредственного возникновения ошибки лучше использовать события, а если нужно передать наверх - по обстоятельствам. |
|
|||||
|
Вы путаете с паттерном "компоновщик".
Композиция это отношение "включает в себя", противопостовляющееся наследованию, выражающему "является". Добавлено через 1 минуту Кстати, реализовать свое всплытие не сложно и вполне себе кошерно пользоваться этим. (реализовывал, но пользоваться не приходилось, если честно. просто случаев не представлялось, хотя есть идеи)
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|