【问题标题】:Global Error Handler for Flash Player 10.1 not workingFlash Player 10.1 的全局错误处理程序不起作用
【发布时间】:2011-03-19 22:58:38
【问题描述】:

尝试在我的项目中实现新的 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);
        }
    }
}

【问题讨论】:

    标签: actionscript-3 flash error-handling global


    【解决方案1】:

    我遇到了与上面相同的问题 - 我引用了 stage.loadInfo,我相信当它引用阶段时,它会捕获所有未捕获的错误。但是,这不起作用,您必须逐字逐句地遵循grapefukt的建议:在实际的基础显示对象上,放置代码

    loaderInfo.uncaughtErrorEvents.add...

    当您尝试放置在stage.loaderInfoframe.loaderInfo 上时,它没有任何效果。

    就我而言,我必须将它放在扩展基本显示对象的类中。很奇怪。

    【讨论】:

    • 我希望这能奏效,可惜它不适合我。我已将事件侦听器直接添加到我的基本显示对象中。通常这段代码应该被它捕获,对吧? ... setTimeout(function():void { throw new Error("foo!"); }, 3000); 但事实并非如此。另外我认为 AIR 的工作方式应该与基于 Web 的 Flash 相同?
    • Haaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr!!我现在知道这是什么问题了。这是一个误会!事件处理程序被调用,但错误仍会冒泡并在 Flash 播放器中打开异常窗口。所以解决方案是 event.preventDefault()!
    【解决方案2】:

    文档说:

    调度事件的 UncaughtErrorEvents 对象与 LoaderInfo 对象或 Loader 对象相关联。

    因此,您必须监听最顶层显示对象的loaderInfouncaughtErrorEvents 属性:

    loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
    

    【讨论】:

    • 还是没有运气!我没主意了! 任何人可以确认上面的例子对他们有用吗?
    【解决方案3】:

    更新:我想我可能知道你为什么认为这不起作用。我犯了在调试器内部测试的错误。当调试器停止运行时错误时,我认为这证明了我的 uncaughtErrorHandler 函数不起作用。事实上,这是错误的。这只是调试器的一个怪癖。调试器仍然会停止,就好像它是一个未处理的错误或异常一样,但是如果你再次按下运行,你会看到它确实执行了错误处理代码。有关更多信息,请参阅我的线程 Flex 4.0/4.5 global error handling

    原始回复: 我正在寻找同样的信息。 API 文档中的示例和有关该主题的各种博客都不适用于我。我已经尝试过 loaderInfo、stage.loaderInfo、systemManager.loaderInfo ... 没有区别。我什至在一个测试用例中尝试了所有这些!正在设置 addEventListener,但未捕获的错误不会触发 uncaughtErrorHandler。啊。我在这上面浪费了太多时间!我已经将它简化为一个非常简单的程序,就像上面一样,除了主 mxml 文件中的所有代码。

    这个怎么样:有人可以发布一个有效的全局错误处理示例吗?我在 mx:Application-based mxml Flex 项目中使用 Flex SDK 4.1(我也尝试过 4.5),针对 FP 10.1(或 4.5 的 10.2)。

    我的帖子:Flex 4.0/4.5 global error handling

    【讨论】:

      【解决方案4】:

      您必须将侦听器设置为不是特定视图,而是主舞台对象,因为它位于显示列表的顶部(因此可以拾取其任何子对象的任何异常)。

      【讨论】:

      • “视图”实际上是最顶层的显示对象容器(它只是作为我的 Main 类的属性提供的)。如果我使用 view.stage.loaderInfo.uncaughtErrorEvents.addEventListener...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2011-03-02
      • 2016-04-10
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多