如何捕获Flex中的所有异常?

时间:2008-09-19 12:43:59

标签: flex exception error-handling

当我在调试Flash播放器中运行Flex应用程序时,只要发生意外情况,我就会弹出异常。但是,当客户使用该应用程序时,他不使用调试Flash播放器。在这种情况下,他没有弹出异常,但他的UI无效。

因此,出于可支持性原因,我想捕获Flex UI中任何位置可能发生的任何异常,并在Flex内部弹出窗口中显示错误消息。通过使用Java,我只是将整个UI代码封装在try / catch块中,但是使用Flex中的MXML应用程序,我不知道,我可以在哪里执行这样的通用try / catch。

9 个答案:

答案 0 :(得分:51)

无法通知Flex 3中未捕获的异常.Adobe了解此问题,但我不知道他们是否计划创建解决方法。

现有的唯一解决方案是将try / catch放在逻辑位置,并确保您正在侦听任何调度它们的ERROR(或FAULT for webservices)事件。

编辑:此外,实际上无法捕获从事件处理程序抛出的错误。我在Adobe Bug System上记录了bug

更新2010-01-12: Flash 10.1AIR 2.0现已支持全局错误处理(均处于测试阶段),并通过订阅{{3}来实现} UNCAUGHT_ERROR的事件。以下代码取自LoaderInfo.uncaughtErrorEvents

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

答案 1 :(得分:9)

Adob​​e错误管理系统中存在错误/功能请求。如果它对你很重要,请投票给它。

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

答案 2 :(得分:4)

适用于Flex 3.3。

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

答案 3 :(得分:3)

请注意,错误FP-444(上图)链接到http://labs.adobe.com/technologies/flashplayer10/features.html#developer,自2009年10月开始显示这可能是10.1,目前,2009年10月28日尚未发布 - 所以我想我们会看看它是否在发布时是真的

答案 4 :(得分:3)

使用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

答案 5 :(得分:3)

我正在使用flex 4。 我试过loaderInfo.UncaughtErrorEvents,但是没有初始化loaderInfo,所以它给了我null引用错误。然后我尝试了root.loaderInfo.UncaughtErrorEvents和同样的故事。 我试过sprite.root.UncaughtErrorEvents,但没有精灵对象,我创建了一个,但它没有用。最后我试了

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

猜猜看,它就像魔法一样。 检查this

答案 6 :(得分:3)

适用于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>

由于

答案 7 :(得分:2)

我将事件监听器附加到“root”,这对我有用:

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项目。

答案 8 :(得分:0)

现在您可以使用加载程序信息:

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