Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > dimarik

Оценить эту запись

О типах исключений.

Запись от dimarik размещена 23.04.2014 в 00:26

Ну как обычно, просто, чтобы не забыть куда постил.

Цитата:
Сообщение от grafillo! Посмотреть сообщение
а метод обработки ошибок try - catch в данном случае лучше не использовать?
Загрузка через Loader#load() может создать как синхронную ошибку, так и асинхронную.
Синхронные исключения... Ах, давай с начала и по порядку!
Начнем, пожалуй.

Привет! Нужно сразу же научиться отличать ошибки от исключений (exceptions).
Ошибки бывают у всех, даже если ты (вдруг, уже) не женат.
Скорее всего сейчас под "ошибкой" ты подразумеваешь исключение (exceptions, еще раз).

Теперь, когда ошибки стали для нас исключениями, давай рассмотрим их типы. Исключения бывают двух типов: синхронные и асинхронные.

1. СИНХРОННЫЕ.
Синхронные выпадают нам через внутренние механизмы флеша (рантайма, adobe flasplayer(c) или adobe air(c)) или через инструкцию throw.
Внутренние механизмы скорее всего обычно выбрасывают исключения типа (подкласса) Error. То есть что мы можем словить в catch(value:Object), где в качестве Object можно указать заинтересованный в "кэтче" тип объекта, который сгенерит throw. Для справки, можно указывать несколько типов для нескольких catch.
Для справки EOFError.
Код AS3:
try {
   var o:Object  = ba.readObject();
} catch (error:EOFError) {
    // trace("Плохой формат у ba, не соответствует AMF3, бро");
} catch (error:TypeError) { // Обычный Error #1009
   // trace("Нулевой ba, bro");
}
Мы же, как прогеры можем сделать throwable что угодно:
Код AS3:
throw new Error("Непредсказуемая ошипка!");
throw "Ошибся в жизни, выбрав флеш!";
throw Sprite;
throw throw; //прокатит?
2. АСИНХРОННЫЕ
Асинхронные исключения флешом генерируются во время асинхронных операций, а по сути инициируются при помощи диспатча объектов подкласса ErrorEvent (это важно, они такие особенные).

Тут нужно упомянуть, что асинхронное исключение ловится только добавлением соответствующего слушателя на литерал ErrorEvent события.
там, "внутри рантайма" происходит примерно следующее:
Код AS3:
if (event is ErrorEvent) {
    if ( !this.hasEventListener(event.type) ) {
        throw event; // происходит неявное преобразование event -> event.toString(); могу ошибаться с конкретикой чего там throw;
    }
}
Простой пример:
Ваш объект генерит события типа ErrorEvent. Все вспоминаем, что литералом или "типом" (я не зря употребил двойные кавычки, чтобы отличать от типа именно объекта ErrorEvent) события во флеше является строка, например, "complete" в константе flash.events.Event.COMPLETE. Предположим, что таким "типом" события является строка "rampageBro". Итак, наш генерируемый объект выглядит так:

Применение

Код AS3:
const errorEvent:ErrorEvent = new ErrorEvent("rampageBro");
// что ж делать, диспатчим.
super.dispatchEvent(errorEvent);
Вот сделайте диспатч new ErrorEvent("rampageBro") и не словите его (ни один хендлер не будет подписан к этому "типу" события). Примите исключение. По вышеописанной процедуре.
Всего комментариев 8

Комментарии

Старый 23.04.2014 14:00 zuxul вне форума
zuxul
Вы забыли упомянуть про глобальный обработчик для всех ошибок, добавленный с какого-то там 10.x плеера.
Старый 23.04.2014 14:49 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
Вы, наверное, про UncaughtErrorEvents.
(Версии среды выполнения: Flash Player 10.1, AIR 2)
А за статейку спасибо.
Сам не пробовал никогда ErrorEvent кидать.
Старый 24.04.2014 11:53 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Классное чтиво ) читал с улыбкой на лице, отличный юмор!
Старый 25.04.2014 12:48 Котяра вне форума
Котяра
 
Аватар для Котяра
Вот это для меня откровение:
Код AS3:
try {
   var o:Object  = ba.readObject();
} catch (error:EOFError) {
    // trace("Плохой формат у ba, не соответствует AMF3, бро");
} catch (error:TypeError) { // Обычный Error #1009
   // trace("Нулевой ba, bro");
}
по сути имеем некое подобие перегруженных функций исходя из типа аргументов.
Старый 25.04.2014 12:52 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Котяра, это не перегрузка ) это синтаксический сахар для if (a is b).
Старый 25.04.2014 16:16 toFL вне форума
toFL
Цитата:
по сути имеем некое подобие перегруженных функций исходя из типа аргументов.
В Java тоже самое. Без этого там вообще не вариант. Да и в AS3 тоже часто пользуюсь.
Старый 26.04.2014 00:03 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Котяра, это не перегрузка ) это синтаксический сахар для if (a is b).
Я вообще-то написал про жалкое подобие правой руки
а сахар скорее над switch (type) / case
Старый 26.04.2014 12:01 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ну, по мне switch/case всегда был сахаром для if/else
 

 


Часовой пояс GMT +4, время: 21:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.