Как отловить все исключения во Flex? - PullRequest
43 голосов
/ 19 сентября 2008

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

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

Ответы [ 9 ]

51 голосов
/ 19 сентября 2008

Невозможно получить уведомление о необработанных исключениях в Flex 3. Adobe знает о проблеме, но я не знаю, планируют ли они создать обходной путь.

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

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

Обновление 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
        }
    }
9 голосов
/ 04 ноября 2008

В системе управления ошибками Adobe есть запрос об ошибке / функции. Проголосуйте за это, если это важно для вас.

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

4 голосов
/ 23 марта 2010

Работает во Flex 3.3.

 if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
    IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
 }
3 голосов
/ 06 июля 2011

Работает во Flex 3.5 и flash player 10:

<?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>

Спасибо

3 голосов
/ 05 мая 2011

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

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

И угадайте что, это работает как магия. проверка это

3 голосов
/ 11 июня 2010

Альтернатива принятому ответу с использованием try-catch. Думаю, медленнее, но проще для чтения.

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

3 голосов
/ 28 октября 2009

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

2 голосов
/ 14 февраля 2011

Я прикрепил прослушиватель событий к «корню», который работал для меня:

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.

0 голосов
/ 04 марта 2015

Теперь вы можете, используя информацию о загрузчике:

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.
}
...