Как отловить все исключения во Flex?

Когда я запускаю приложение Flex в отладочном флеш-плеере, я получаю всплывающее исключение, как только происходит нечто неожиданное. Однако, когда клиент использует приложение, он не использует отладочный флеш-плеер. В этом случае он не получает всплывающее исключение, но он не работает.

Поэтому по соображениям поддержки я хотел бы перехватить любое исключение, которое может произойти в любом месте пользовательского интерфейса Flex, и представить сообщение об ошибке во внутреннем всплывающем окне Flex. Используя Java, я бы просто инкапсулировал весь код пользовательского интерфейса в блок try / catch, но с MXML-приложениями во Flex я не знаю, где я мог бы выполнить такую общую попытку / catch.

Ответы на вопрос(9)

Решение Вопроса

dobe знает о проблеме, но я не знаю, планируют ли они создать обходной путь.

Единственное решение, как оно есть, - это поместить try / catch в логические места и убедиться, что вы слушаете событие ERROR (или FAULT для веб-сервисов) для всего, что их отправляет.

Edit: Кроме того, фактически невозможно отловить ошибку, выданную обработчиком события. Я вошелошибка в системе ошибок Adobe.

Update 2010-01-12: Глобальная обработка ошибок теперь поддерживается вFlash 10.1 а такжеAIR 2.0 (как в бета-версии), так и достигается путем подпискиUNCAUGHT_ERROR событиеLoaderInfo.uncaughtErrorEvents, Следующий код взят изпример кода на liveocs:

public class UncaughtErrorEventExample extends Sprite
{
    public function UncaughtErrorEventExample()
    {
        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
        }
    }
 21 окт. 2010 г., 00:27
@ Ваутер - я тоже вижу такое поведение. Не стесняйтесь голосовать / добавлять комментарии к моей ошибке:bugs.adobe.com/jira/browse/FB-27199
 07 мар. 2010 г., 15:54
Требуется ли для глобальной обработки ошибок во Flash 10.1 работа с flex 3.5? 4? Или это работает и во Flex 3?
 27 окт. 2010 г., 14:36
Чтобы добавить к этому ответу: если вы работаете в отладочной версии Flash Player, диалоговое окно с общей ошибкой во время выполнения по-прежнему будет появляться. Чтобы предотвратить это, вызовите event.preventDefault () в вашем глобальном обработчике ошибок.
 20 окт. 2010 г., 17:27
Комментарий Ричарда: Это действительно зависит от того, как вы ожидаете, что это сработает, но, к сожалению, это не так. Если вы компилируете Flash Player 9 в качестве цели и запустите его на Flash Player 10.1, loaderInfo [& quot; uncaughtErrorEvents & quot;] по-прежнему недоступен! Моя интерпретация: проигрыватель Flash во время выполнения проверяет, на какого игрока был нацелен ваш SWF, и & quot; скрывает & quot; функции, которых еще не было в этой версии.
 07 мар. 2010 г., 19:13
Мой код выше требовал Flex 4. Однако он должен работать в любом SDK, работающем против 10.1, если вы используете((IEventDispatcher)loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", handlerFunction)потому что свойства будут существовать во время выполнения в плеере. Вы могли бы даже обернуть этоif (loaderInfo.hasProperty("uncaughtErrorEvents") { } чтобы он не сломался во Flash 9/10 (обработка ошибок, конечно, не сработает, но не даст сбой)

http://labs.adobe.com/technologies/flashplayer10/features.html#developer что с октября 2009 г. это станет возможным, начиная с 10.1, которая в настоящее время, 28 октября 2009 г., еще не выпущена, так что, я думаю, мы увидим, правда ли это, когда она выйдет

sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

В отладочном Flash Player это все равно будет ошибкой, но в не отладочной версии ошибка появится в диалоговом окне Flash Player - и обработчик ответит. Чтобы остановить появление диалогового окна, добавьте:

event.preventDefault();

так:

    private function onUncaughtError(event:UncaughtErrorEvent):void
    {
        event.preventDefault();
        // do something with this error
    }

Я использовал это в AIR, но я предполагаю, что это работает и для стандартных проектов AS3.

медленнее, но читать проще.

try {
    loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
} catch (e:ReferenceError) {
    var spl:Array = Capabilities.version.split(" ");
    var verSpl:Array = spl[1].split(",");

    if (int(verSpl[0]) >= 10 &&
        int(verSpl[1]) >= 1) {
        // This version is 10.1 or greater - we should have been able to listen for uncaught errors...
        d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
    }
}

Конечно, вам необходимо использовать обновленный 10.1 playerglobal.swc для успешной компиляции этого кода: http://labs.adobe.com/downloads/flashplayer10.html

Я использую flex 4. Я старалсяloaderInfo.UncaughtErrorEvents, но loaderInfo не был инициализирован, поэтому он дал мне нулевую ссылку. Тогда я попробовалroot.loaderInfo.UncaughtErrorEvents и та же история. Я старался,sprite.root.UncaughtErrorEvents, но не было спрайтового объекта, я его создал, но он не работал. Наконец то попробовал

systemManager.loaderInfo.uncaughtErrorEvents.addEventListener (UncaughtErrorEvent.UNCAUGHT_ERROR, globalUnCaughtErrorHandler.hanleUnCaughtError);

И угадайте что, это работает как волшебство. проверятьэтот

<?xml version="1.0" encoding="utf-8"?>

        protected function application1_addedToStageHandler(event:Event):void{              
            if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
                IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
            }

            sdk.text = "Flex " + mx_internal::VERSION;
        }

        private function uncaughtErrorHandler(e:*):void{
            e.preventDefault();

            var s:String;

            if (e.error is Error)
            {
                var error:Error = e.error as Error;
                s = "Uncaught Error: " + error.errorID + ", " + error.name + ", " + error.message;
            }
            else
            {
                var errorEvent:ErrorEvent = e.error as ErrorEvent;
                s = "Uncaught ErrorEvent: " + errorEvent.text;
            }

            msg.text = s;
        }

        private function unCaught():void
        {
            var foo:String = null;
            trace(foo.length);
        }
    ]]>
</mx:Script>
<mx:VBox>
    <mx:Label id="sdk" fontSize="18"/>
    <mx:Button y="50" label="UnCaught Error" click="unCaught();" />
    <mx:TextArea id="msg" width="180" height="70"/>
</mx:VBox>

Спасибо

функции. Голосуйте за него, если это важно для вас.

http://bugs.adobe.com/jira/browse/FP-444

http://www.adobe.com/devnet/flex/articles/global-exception-handling.html

Оформить заказ: loaderInfo.uncaughtErrorEvents.addEventListener (UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}

 if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
    IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
 }

Ваш ответ на вопрос