Глобальный обработчик ошибок для Flash Player 10.1 не работает

Пытаюсь внедрить новый глобальный обработчик ошибок FP 10.1 в свои проекты, но независимо от того, что я делаю, любая неперехваченная ошибка все равно будет отображать окно исключения (как в отладочной, так и в окончательной версиях SWF). Все, что я хочу сделать, это предотвратить эти всплывающие окна, а вместо этого отправить сообщение моему регистратору. Вот мой код...

РЕДАКТИРОВАТЬ: сейчас я упростил код. Может ли кто-нибудь оказать мне услугу и протестировать следующий класс и посмотреть, работает ли он для него? Потому что это не для меня! ...

package
{
    import flash.display.Sprite;
    import flash.events.UncaughtErrorEvent;    

    public class GlobalErrorHandlerTest extends Sprite
    {
        public function GlobalErrorHandlerTest()
        {
            stage.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
            throw new Error();
        }           

        private function onUncaughtError(e:UncaughtErrorEvent):void 
        {
            var message:String;
            if (e.error["message"])
            {
                message = e.error["message"];
            }
            else if (e.error["text"])
            {
                message = e.error["text"];
            }
            else
            {
                message = e.error["toString"]();
            }

            trace("Uncaught Error: " + e.text);
        }
    }
}

person BadmintonCat    schedule 23.07.2010    source источник


Ответы (4)


У меня была та же проблема, что и выше: я ссылался на stage.loadInfo, полагая, что, поскольку это ссылается на этап, он будет фиксировать все неперехваченные ошибки. Однако это не сработает, вы должны дословно следовать предложению грейпфукта: на фактический базовый экранный объект поместите код

loaderInfo.uncaughtErrorEvents.add...

Когда вы пытаетесь разместить на stage.loaderInfo или frame.loaderInfo, это не дает никакого эффекта.

В моем случае мне пришлось поместить его в класс, расширяющий базовый экранный объект. Очень странно.

person Jake    schedule 11.04.2011
comment
Я хотел бы, чтобы это работало, но, увы, это не для меня. Я добавил прослушиватель событий непосредственно в свой базовый экранный объект. Обычно этот код должен быть перехвачен им, верно? ... setTimeout(function():void { throw new Error("foo!"); }, 3000); Но это не так. Также я полагаю, что это должно работать так же для AIR, как и для веб-Flash? - person BadmintonCat; 12.04.2011
comment
Хаааррррррррррррррррррррррррррррррррррррррррррррррррррррррррррр!!!! Теперь я знаю, в чем была проблема. Это было недоразумение! Обработчик события был вызван, но ошибка по-прежнему всплывала и открывала окно исключения в проигрывателе Flash. Таким образом, решение этой проблемы — event.preventDefault()! - person BadmintonCat; 28.04.2011

Документы говорят, что:

Объект UncaughtErrorEvents, который отправляет событие, связан либо с объектом LoaderInfo, либо с объектом Loader.

Таким образом, вы должны прослушивать свойство loaderInfo uncaughtErrorEvents вашего самого верхнего экранного объекта:

loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
person grapefrukt    schedule 23.08.2010
comment
Все равно не повезло! У меня нет идей! Может ли кто-нибудь подтвердить, что приведенный выше пример работает для них?? - person BadmintonCat; 25.08.2010

ОБНОВЛЕНИЕ: я думаю, что могу знать, почему вы думаете, что это не работает. Я сделал ошибку тестирования внутри отладчика. Когда отладчик остановился на ошибках времени выполнения, я предположил, что это доказывает, что моя функция uncaughtErrorHandler не работает. На самом деле это было ошибкой. Это просто особенность отладчика. Отладчик все равно остановится, как если бы это была необработанная ошибка или исключение, но если вы снова нажмете «Выполнить», вы увидите, что он ДЕЙСТВИТЕЛЬНО выполняет код обработки ошибок. См. мой поток Глобальная обработка ошибок Flex 4.0/4.5 для получения дополнительной информации.

Оригинальный ответ: Я ищу эту же информацию. Ни один из примеров в документе API или различных блогах по этому вопросу не работает для меня. Я пробовал только loaderInfo, stage.loaderInfo, systemManager.loaderInfo... Без разницы. Я даже пробовал их все в одном тесте! AddEventListener устанавливается, но необработанные ошибки не запускают uncaughtErrorHandler. Арх. Я потратил слишком много времени на это! Я сократил ее до очень простой программы, очень похожей на приведенную выше, за исключением того, что весь код находится в основном файле mxml.

Как насчет этого: может ли кто-нибудь опубликовать пример глобальной обработки ошибок, который РАБОТАЕТ? Я использую Flex SDK 4.1 (я также пробовал с 4.5), ориентируясь на FP 10.1 (или 10.2 для 4.5), в проекте mx:Application-based mxml Flex.

Моя тема: Глобальная обработка ошибок Flex 4.0/4.5

person Rich Sadowsky    schedule 17.05.2011

Вы должны настроить прослушиватель не на конкретное представление, а на основной объект сцены, так как он находится в верхней части списка отображения (таким образом, выбирая любое исключение любого из его дочерних элементов).

person Juan Delgado    schedule 23.07.2010
comment
«Вид» на самом деле является самым верхним контейнером отображаемых объектов (он просто задан как свойство моего основного класса). И это также не работает, если я использую view.stage.loaderInfo.uncaughtErrorEvents.addEventListener... - person BadmintonCat; 23.07.2010