Обрабатывает ли addEventListener (ErrorEvent.ERROR, обработчик) весь тип события ошибки в actionscript3? - PullRequest
0 голосов
/ 06 октября 2011

Обрабатывает ли addEventListener(ErrorEvent.ERROR, handler) все типы событий ошибок, например, IOErrorEvent.IO_ERROR, SecurityErrorEvent.SECURITY_ERROR и другие все события ошибок?

Я ищу addEventListener() версию try catch(e:Error) (e: Ошибка может перехватывать все типы ошибок).

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Вы можете добавить обработчики ошибок к объекту UncaughtErrorEvents:

loaderInfo.uncaughtErrorEvents.addEventListener(
    UncaughtErrorEvent.UNCAUGHT_ERROR, errorHandler);

function errorHandler(e:UncaughtErrorEvent):void {
   if(event.error is Error) {
      // handle error
   }
   // suppress error dialog
   e.preventDefault();
}

Это возможно только в Flash Player 10.1 и выше.

Вы можете найти больше информации здесь: flash.events.UncaughtErrorEvents

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

0 голосов
/ 21 августа 2013

Каждый тип события регистрируется как отдельный String, поэтому единственный способ перехватить все события разных типов - это прослушать неисследованных ошибок, которые передаются специальным UncaughtErrorEvents диспетчер. Примечательно, что это существует в любом DisplayObject loaderInfo свойстве @ DisplayObject.loaderInfo.uncaughtErrorEvents.

Демонстрация 3 способов получения необнаруженных ошибок ...

private var loader:Loader = new Loader();

public function MyDocumentClass ()
{
    // 1: Listen for all errors in the application:
    loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);

    // 2: Listen for errors from the child swf being loaded:
    loader.load(new URLRequest("file.swf"));
    loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
    // 3: Listen for errors from Loader doing the loading:
    loader.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);

    // This seems like it would work, but wasn't working in tests I ran:
    stage.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
}

private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
    if (event.error is Error)
    {
        var error:Error = event.error as Error;
        // do something with the error
    }
    else if (event.error is ErrorEvent)
    {
        var errorEvent:ErrorEvent = event.error as ErrorEvent;
        // do something with the error
    }
    else
    {
        // a non-Error, non-ErrorEvent type was thrown and uncaught
    }
}

Из Документация Adobe ...

Объект UncaughtErrorEvent (extends ErrorEvent) отправляется экземпляр класса UncaughtErrorEvents при необработанной ошибке происходит. Необнаруженная ошибка возникает, когда выдается ошибка вне любые блоки try..catch или когда объект ErrorEvent отправляется с нет зарегистрированных слушателей. Функциональность необработанной ошибки часто описывается как «глобальный обработчик ошибок».

Доступ к объекту UncaughtErrorEvents возможен двумя способами ...

  • LoaderInfo.uncaughtErrorEvents - для обнаружения необнаруженных ошибок в коде, определенном в том же SWF.

    Объект, отправляющий событие uncaughtError, когда необработанный ошибка происходит в SWF, который загружен этим объектом Loader. необнаруженная ошибка возникает, когда выдается ошибка вне блоки try..catch или когда объект ErrorEvent отправляется без зарегистрированные слушатели.

    Обратите внимание, что свойство uncaughtErrorEvents объекта Loader отправляет события, которые проходят через него, а не события, которые он отправляет напрямую. Он никогда не отправляет uncaughtErrorEvent в целевой фазе. Это только отправляет событие на этапах захвата и образования пузырьков. Чтобы обнаружить необнаруженная ошибка в текущем SWF (SWF, в котором находится объект Loader определено) вместо этого используйте свойство LoaderInfo.uncaughtErrorEvents.

  • Loader.uncaughtErrorEvents - для обнаружения неперехваченных ошибок в коде, определенном в SWF, загруженном объектом Loader.

    Объект, отправляющий событие uncaughtError, когда необработанный Ошибка происходит в коде в SWF-файле этого объекта LoaderInfo. Необученный ошибка возникает, когда выдается ошибка за пределами любых блоков try..catch или когда объект ErrorEvent отправляется без зарегистрированных слушателей.

    Это свойство создается, когда SWF-файл связан с этим LoaderInfo. закончила загрузку. До этого момента свойство uncaughtErrorEvents ноль. В проекте только для ActionScript вы можете получить доступ к этому свойству во время или после выполнения функции конструктора основного класс SWF-файла. Для проекта Flex, uncaughtErrorEvents свойство доступно после того, как событие applicationComplete посланные.

Некоторые важные детали из документации Adobe ...

Когда происходит событие uncaughtError, даже если событие обрабатывается, выполнение не продолжается в стеке вызовов, вызвавшем ошибку. Если ошибка является синхронной, любой код, оставшийся в функция, в которой произошла ошибка, не выполняется. Следовательно, это Скорее всего, когда происходит событие с неперехваченной ошибкой, ваше приложение в нестабильном состоянии. Поскольку может быть много причин для необученного ошибка, невозможно предсказать, какая функциональность доступна. Например, ваше приложение может выполнять сеть операции или файловые операции. Тем не менее, эти операции не обязательно в наличии.

Когда контент выполняется в отладочной версии среды выполнения, такой как версия отладчика Flash Player или AIR Debug Launcher (ADL), при возникновении неперехваченной ошибки появляется диалоговое окно с неперехваченной ошибкой. За эти версии во время выполнения, диалог ошибки появляется, даже когда слушатель зарегистрирован для события uncaughtError. Чтобы предотвратить диалог в этой ситуации вызвать объект UncaughtErrorEvent Метод protectDefault ().

0 голосов
/ 06 октября 2011

Если вы хотите перехватить все ошибки в вашем приложении, вам определенно следует использовать блоки try-catch. Используя addEventListener, вы добавляете слушателя к определенному объекту, и вы будете ловить ошибки только там.

...