flex全域性異常

yunzhongxia發表於2011-08-22

      從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 error
				log.error("errorId={0}  message={1}\n  stack={2}",[error.errorID,error.message,error.getStackTrace()]);
			}
			else
			{
				// a non-Error, non-ErrorEvent type was thrown and uncaught
				log.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>

 

     

相關文章