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

时间:2020-03-06 14:25:45  来源:igfitidea点击:

当我在调试Flash Player中运行Flex应用程序时,一旦发生意外,就会弹出一个异常。但是,当客户使用该应用程序时,他不使用调试Flash Player。在这种情况下,他不会弹出异常,但是他的UI无法正常工作。

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

解决方案

Flex 3中没有通知未捕获的异常的方法。Adobe意识到了这个问题,但是我不知道他们是否计划创建解决方法。

唯一的解决方案是将try / catch放在逻辑位置,并确保我们正在侦听ERROR(对于Webservices而言是FAULT)事件,以对其进行调度。

编辑:此外,实际上不可能捕捉到事件处理程序引发的错误。我已经在Adobe Bug System上记录了一个bug。

更新2010年1月12日:Flash 10.1和AIR 2.0(均在beta中)现在支持全局错误处理,并且可以通过订阅LoaderInfo.uncaughtErrorEvents的UNCAUGHT_ERROR事件来实现。以下代码摘自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
        }
    }

Adobe错误管理系统中对此有错误/功能请求。如果对我们很重要,请投票。

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

请注意,错误FP-444(上述)链接到http://labs.adobe.com/technologies/flashplayer10/features.html#developer,自2009年10月起显示,从10.1开始(目前是10月28日, 2009年仍未发布,所以我想我们会在发布时查看是否正确

它可以在Flex 3.3中使用。

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

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