Pergunta

Quando eu executar uma aplicação Flex no flash player de depuração eu recebo uma exceção pop-up, logo que algo inesperado aconteceu. No entanto, quando um cliente usa o aplicativo, ele não usa o flash player de depuração. Neste caso, ele não recebe uma exceção pop-up, mas ele UI não está funcionando.

Assim, por razões de suportabilidade, eu gostaria de pegar qualquer exceção que pode acontecer em qualquer lugar na interface do usuário do Flex e apresentar uma mensagem de erro em um pop-up interna Flex. Usando Java Gostaria apenas de encapsular o código UI inteiro em um bloco try / catch, mas com aplicações MXML no Flex que eu não sei, onde eu poderia realizar tal um try / catch em geral.

Foi útil?

Solução

Não há nenhuma maneira de ser notificado sobre exceções.Ele em Flex 3. Adobe está ciente do problema, mas eu não sei se eles planejam criar uma solução alternativa.

A única solução, tal como está é colocar try / catch em lugares lógicos e certifique-se que você está ouvindo o erro (ou FALHA para webservices) evento para qualquer coisa que distribui-las.

Editar: Além disso, é realmente impossível pegar um erro lançada a partir de um manipulador de eventos. Eu ter registrado um bug no Adobe Bug do sistema.

Atualização 2010-01-12: manipulação de erro global é agora suportado em Flash 10.1 e AR 2.0 (tanto em beta), e é obtido pela subscrição do UNCAUGHT_ERROR caso de LoaderInfo.uncaughtErrorEvents . O código a seguir é retirado do exemplo de código na livedocs :

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

Outras dicas

Há um pedido bug / recurso para este no sistema de gestão bug Adobe. Voto para ele se é importante para você.

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

Ele funciona no Flex 3.3.

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

Note que o bug FP-444 (acima) links para http: // labs.adobe.com/technologies/flashplayer10/features.html#developer que desde Out 2009 mostra que isso será possível a partir de 10.1, que atualmente, 28 de outubro de 2009 ainda é inédito - então eu acho que nós vamos ver se isso é verdade quando ele fica liberado

Alternativa para resposta aceita, usando try-catch. Mais lento, mas mais fácil de ler, eu acho.

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);
    }
}

É claro, você precisa estar usando um 10,1 playerglobal.swc up-to-date, a fim de compilar este código com sucesso: http://labs.adobe.com/downloads/flashplayer10.html

Eu estou usando Flex 4. Tentei loaderInfo.UncaughtErrorEvents, mas loaderInfo não foi inicializado para que ele me deu erro referência nula. Então eu tentei root.loaderInfo.UncaughtErrorEvents e a mesma história. Tentei sprite.root.UncaughtErrorEvents, mas não havia nenhum objeto sprite, eu criei um, mas não funcionou. Finalmente eu tentei

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

E adivinhem, ele funciona como mágica. verificar este

Ele funciona no Flex 3.5 e 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>

Graças

I anexa o ouvinte de eventos para o 'root', que funcionou para mim:

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

Na depuração Flash Player isto ainda erro, mas na versão não-debug o erro será exibido na caixa de diálogo do Flash Player - e, em seguida, o manipulador irá responder. Para parar a caixa de diálogo de aparecer, adicione:

event.preventDefault();

forma:

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

Eu estava usando isso no ar, mas eu suponho que ele funciona para projetos AS3 padrão também.

Agora você pode, usando informações loader:

http://www.adobe.com/devnet/ Flex / artigos / global-exception-handling.html

Checkout: loaderInfo.uncaughtErrorEvents.addEventListener (UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top