flex全局异常
????? 从Flash Player 10.1 和Adobe AIR 2.0 开始,开发人员就能够全局地捕获未处理异常和错误。然而,我们尽量在异常发生时来做处理。全局处理应该只用于您确实无法用其他方法控制的异步异常,或者未经本地捕获的诊断和日志异常。
???? 全局异常一个核心类就是UncaughtErrorEvent.UNCAUGHT_ERROR,LoaderInfo对象可以监听该事件,Application当然也可以监听该事件了。
???下面是UncaughtErrorEvent的API的介绍
???
?
?
?? 以下代码是我写的一个记录全局未捕获异常的代码,仅供参考:
?
package org.sdp.context{import flash.display.LoaderInfo;import flash.events.ErrorEvent;import flash.events.UncaughtErrorEvent;import org.sdp.logging.logger.ILogger;import org.sdp.logging.manager.LogManager;/** * * desc:捕获未catch的异常信息 * * @author hanjn * @version 1.0.0 * @date 2011-8-21 */public class GlobalErrorHandler{private static var globalErrorHandler:GlobalErrorHandler=null;private static var log:ILogger=LogManager.registerLog("org.sdp.context.GlobalErrorHandler");/** * 得到GlobalErrorHandler实例 * @return GlobalErrorHandler一个实例 * */public static function getInstance():GlobalErrorHandler {if(globalErrorHandler==null){globalErrorHandler=new GlobalErrorHandler();}return globalErrorHandler;}/** * 对一个LoaderInfo添加Uncaught事件 * @param loaderInfo * */public function addUncaughtEvent(loaderInfo:LoaderInfo):void{loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,uncaughtErrorHandler);}/** *处理caught事件 * @param event * */private function uncaughtErrorHandler(event:UncaughtErrorEvent):void{if (event.error is Error){var error:Error = event.error as Error;log.error("errorId={0} message={1}\n stack={2}",error.errorID,error.message,error.getStackTrace());}else if (event.error is ErrorEvent){var errorEvent:ErrorEvent = event.error as ErrorEvent;// do something with the errorlog.error("errorId={0} message={1}\n stack={2}",[error.errorID,error.message,error.getStackTrace()]);}else{// a non-Error, non-ErrorEvent type was thrown and uncaughtlog.error("Uncaught Error!");}}}}
?
??
?使用方法很简单:
?
?
?
?
?
GlobalErrorHandler.getInstance().addUncaughtEvent(application.loaderInfo);
?
?
?
?
?
?
?
??注意一点上上面的代码只针对Application有效,对ModuleLoader里面加载的module就无效了饿,看了一片文章后,通过下面的代码可以监听Module的异常事件
?
?
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009"xmlns:s="library://ns.adobe.com/flex/spark"xmlns:mx="library://ns.adobe.com/flex/mx"layout="vertical"initialize="init()"><fx:Script><![CDATA[import mx.events.ModuleEvent;private function init():void{systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,uncaughtErrorHandler);}private function uncaughtErrorHandler(event:UncaughtErrorEvent):void{trace("caught uncaught error");event.preventDefault();}]]></fx:Script><fx:Declarations><!-- Place non-visual elements (e.g., services, value objects) here --></fx:Declarations><mx:ModuleLoader id="moduleLoader" url="GEHFlexModule.swf" width="200" height="150" /></mx:Application>
?
?????