当我运行在调试flash播放器Flex应用程序我得到一个异常尽快意想不到的事情发生弹出。 然而,当客户使用应用程序,他不使用调试flash播放器。 在这种情况下,他没有得到一个异常弹出,但他用户界面是不工作。
因此,对于保障性的原因,我想赶上能在Flex UI在任何地方发生,并在Flex内部弹出显示一条错误消息的任何异常。 通过使用Java我只是封装在一个try / catch块整个UI代码,但在Flex的MXML应用程序,我不知道,我在那里可以执行这样一个普遍的try / catch。
当我运行在调试flash播放器Flex应用程序我得到一个异常尽快意想不到的事情发生弹出。 然而,当客户使用应用程序,他不使用调试flash播放器。 在这种情况下,他没有得到一个异常弹出,但他用户界面是不工作。
因此,对于保障性的原因,我想赶上能在Flex UI在任何地方发生,并在Flex内部弹出显示一条错误消息的任何异常。 通过使用Java我只是封装在一个try / catch块整个UI代码,但在Flex的MXML应用程序,我不知道,我在那里可以执行这样一个普遍的try / catch。
有没有办法在Flex 3中的Adobe捕获的异常通知都意识到了这个问题,但我不知道他们是否计划建立一个解决方法。
因为它代表唯一的解决办法是把try / catch语句在逻辑的地方,并确保您正在收听到调度它们的错误(或故障的web服务)事件的任何东西。
编辑:此外,它实际上不可能追上从事件处理程序引发的错误。 我已经登录一个错误在Adobe纠错系统。
更新2010-01-12:现在支持全局的错误处理的Flash 10.1和AIR 2.0 (两者处于测试阶段),并通过订阅的实现UNCAUGHT_ERROR的事件LoaderInfo.uncaughtErrorEvents 。 下面的代码是从所拍摄的有关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漏洞管理系统,这是个Bug /功能请求。 选它,如果它是对你很重要。
http://bugs.adobe.com/jira/browse/FP-444
它工作在Flex的3.3。
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
}
注意,错误FP-444(以上)的链接http://labs.adobe.com/technologies/flashplayer10/features.html#developer ,自2009年10月表明,这将是可能的的10.1,而目前,10月28日2009年仍是未发行的 - 所以我想我们会看到,如果当它被释放的这是真的
替代接受的答案,使用的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
我使用Flex 4,我试过loaderInfo.UncaughtErrorEvents,
但的LoaderInfo没有初始化,它给了我空引用错误。 然后我试图root.loaderInfo.UncaughtErrorEvents
和同样的故事。 我试过sprite.root.UncaughtErrorEvents
,但没有组图对象,我创建了一个,但没有奏效。 最后,我想
systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);
你猜怎么着,它就像魔法。 检查此
它的工作原理的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>
谢谢
我重视的事件侦听器的“根”,这为我工作:
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
}
我在空气中使用,但我认为它适用于标准的AS3项目了。
现在,您可以使用装载机信息:
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.
}