如何在Flex中捕获所有异常?
当我在调试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