addEventListener(ErrorEvent.ERROR,handler)是否处理​​actionscript3中的所有类型的错误事件?

时间:2011-10-06 06:28:20

标签: actionscript-3 error-handling addeventlistener

addEventListener(ErrorEvent.ERROR, handler)是否会处理所有类型的错误事件,例如IOErrorEvent.IO_ERRORSecurityErrorEvent.SECURITY_ERROR以及其他所有错误事件?

我正在寻找addEventListener()try catch(e:Error)(e:错误可以捕获所有类型的错误)。

3 个答案:

答案 0 :(得分:2)

您可以向UncaughtErrorEvents对象添加错误处理程序:

loaderInfo.uncaughtErrorEvents.addEventListener(
    UncaughtErrorEvent.UNCAUGHT_ERROR, errorHandler);

function errorHandler(e:UncaughtErrorEvent):void {
   if(event.error is Error) {
      // handle error
   }
   // suppress error dialog
   e.preventDefault();
}

这仅适用于Flash Player 10.1及更高版本。

您可以在此处找到更多信息:flash.events.UncaughtErrorEvents

这对于处理加载的SWF中的异常特别有用。我认为你有好的理由这样做?

答案 1 :(得分:0)

如果你想捕获应用程序中的所有错误,你肯定应该使用try-catch块。通过使用addEventListener,您可以将侦听器添加到特定对象,并且只会在那里捕获错误。

答案 2 :(得分:0)

每个事件类型都注册为不同的String,因此捕获所有不同类型事件的唯一方法是收听未捕获错误由特殊的UncaughtErrorEvents调度员转发。值得注意的是,这存在于任何DisplayObject的{​​{1}}属性@ loaderInfo上。

演示3种接收未捕获错误的方法......

DisplayObject.loaderInfo.uncaughtErrorEvents

来自Adobe's documentation ...

  

一个private var loader:Loader = new Loader(); public function MyDocumentClass () { // 1: Listen for all errors in the application: loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); // 2: Listen for errors from the child swf being loaded: loader.load(new URLRequest("file.swf")); loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); // 3: Listen for errors from Loader doing the loading: loader.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); // This seems like it would work, but wasn't working in tests I ran: stage.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 } } (扩展UncaughtErrorEvent)对象被调度   未捕获错误时ErrorEvent类的实例   发生。当错误被抛出时,会发生未被捕获的错误   任何UncaughtErrorEvents块或者在调度try..catch对象时   没有注册听众。未捕获的错误事件功能是   通常被描述为“全局错误处理程序。”

可以通过两种方式访问​​ErrorEvent对象...

  • UncaughtErrorEvents - 检测同一SWF中定义的代码中未捕获的错误。

      

    在未处理时调度uncaughtError事件的对象   在此Loader对象加载的SWF中发生错误。一个   当任何错误被抛出时,会发生未被捕获的错误   try..catch块或者在没有调度ErrorEvent对象时   注册听众。

         

    请注意,Loader对象的uncaughtErrorEvents属性将调度   泡在其中的事件,而不是直接发送的事件。   它永远不会在目标阶段调度uncaughtErrorEvent。它只是   在捕获和冒泡阶段调度事件。检测一个   当前SWF(Loader对象中的SWF)中未被捕获的错误   已定义)使用LoaderInfo.uncaughtErrorEvents属性。

  • LoaderInfo.uncaughtErrorEvents - 检测Loader对象加载的SWF中定义的代码中的未捕获错误。

      

    在未处理时调度uncaughtError事件的对象   此LoaderInfo对象的SWF文件中的代码中发生错误。没有被捕   在任何try..catch块之外抛出错误时会发生错误   或者在没有注册的情况下调度ErrorEvent对象时   听众。

         

    当与此LoaderInfo关联的SWF时,将创建此属性   已完成加载。在那之前,uncaughtErrorEvents属性是   空值。在仅ActionScript项目中,您可以访问此属性   在执行main的构造函数期间或之后   SWF文件的类。对于Flex项目,unaughtErrorEvents   applicationComplete事件发生后,属性可用   调度。

Adobe's documentation...

中的一些重要细节
  

当发生uncaughtError事件时,即使处理了事件,   执行不会在导致错误的调用堆栈中继续。   如果错误是同步错误,则保留的任何代码   发生错误的函数未执行。因此,它是   可能是当发生未被捕获的错误事件时,您的应用程序就是   处于不稳定状态。因为未被捕获可能有许多原因   错误,无法预测可用的功能。   例如,您的应用程序可能能够执行网络   操作或文件操作。但是,那些操作不是   必然可用。

     

当内容在运行时的调试版中运行时,例如   Flash Player或AIR Debug Launcher(ADL)的调试版,   当未捕获的错误发生时,会出现未捕获的错误对话框。对于   那些运行时版本,即使是一个监听器,也会出现错误对话框   已注册uncaughtError事件。阻止对话框   出现在那种情况下,调用UncaughtErrorEvent对象   preventDefault()方法。