当前位置:首页 > Flex全局异常和错误处理
Flex全局异常和错误处理
从 Flash Player 10.1 和 Adobe AIR 2.0 开始,开发人员就能够全局地捕获未处理异常和错误。然而,注意在异常发生位置对异常进行处理是最好的方法。全局处理应该只用于您确实无法用其他方法控制的异步异常,或者未经本地捕获的诊断和日志异常。 在本文中,我将介绍如何使用 uncaughtError* 事件全局地捕获未处理异常或错误。我使用的技术是说明性的,且基于 MXML;它使用 Flex 特有的 [Mixin] 元数据标签。
要求
Flash Builder 4
? 下载试用
? Flash Player 10.1 示例文件
? global-exception-handler.zip 预备知识
对 Flex、MXML 和事件处理器的了解将有助于您理解本文。
处理未捕获错误
处理未捕获错误的新 API 可采用以下方式使用:
loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError); private function onUncaughtError(e:UncaughtErrorEvent):void { // Do something with your error. } 当您使用 Flex 时,您可以添加一个 UncaughtErrorEvent.UNCAUGHT_ERROR 监听器到 loaderInfo 对象,您一定要在 FlexEvent.APPLICATION_COMPLETE 事件触发之后才执行这个操作,否则您将遇到一个错误,即:Error #1009: Cannot access a property or method of a null object reference。
为了简化这个过程,并去掉所有这些最终会使主应用程序类变得凌乱的粘合代码和配置代码,我创建了一个 GlobalExceptionHandler 组件。这个实现与 APPLICATION_COMPLETE 事件并无直接关系;相反,它使用的是 [Mixin] 元数据标签。另外,您可以采取说明性方式来使用它;例如:
以下是 GlobalExceptionHandler 的代码:
package com.adobe.ac.logging { import flash.display.LoaderInfo; import flash.events.UncaughtErrorEvent; import mx.managers.ISystemManager; [Mixin] [DefaultProperty(\ public class GlobalExceptionHandler { private static var loaderInfo:LoaderInfo; [ArrayElementType(\onHandlerAction\ public var handlerActions:Array; public var preventDefault:Boolean; public static init(sm:ISystemManager):void { loaderInfo = sm.loaderInfo; } public function GlobalExceptionHandler() { loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); } private function uncaughtErrorHandler(event:UncaughtErrorEvent):void { for each (var action:GlobalExceptionHandlerAction in handlerActions) { action.handle(event.error); } if (preventDefault == true) { event.preventDefault(); } } function } } 以下是 LogHandlerAction 的代码:
package com.adobe.ac.logging { import mx.logging.ILogger; import mx.logging.Log; public class LogHandlerAction GlobalExceptionHandlerAction { private static const LOG:ILogger Log.getLogger(\ public function handle(error:Object):void { if (error is Error) { var errorObj:Error = error as Error; LOG.error(\ errorObj.errorID, errorObj.message, errorObj.getStackTrace()); } } } }
implements =
共分享92篇相关文档