包 | flash.events |
类 | public class UncaughtErrorEvent |
继承 | UncaughtErrorEvent ErrorEvent TextEvent Event Object |
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.1, AIR 2 |
try..catch
块引发错误时,或调度的 ErrorEvent 对象没有注册的侦听器时,会发生未被捕获的错误。未被捕获的错误事件功能通常称为“全局错误处理程序”。
调度事件的 UncaughtErrorEvents 对象与 LoaderInfo 对象或 Loader 对象关联。使用下列属性访问 UncaughtErrorEvents 实例:
-
LoaderInfo.uncaughtErrorEvents
:检测同一 SWF 中定义的代码中的未被捕获的错误。 -
Loader.uncaughtErrorEvents
:检测 Loader 对象加载的 SWF 中定义的代码中的未被捕获的错误。
当发生 uncaughtError
事件时,即使处理了该事件,也不会在导致该错误的调用堆栈中继续执行操作。如果此错误是一个同步错误,将不会执行发生错误的函数中的剩余代码。因此,当发生未被捕获的错误事件时,应用程序可能会处于不稳定状态。因为导致发生未被捕获的错误的原因很多,所以不可能预测哪项功能可用。例如,您的应用程序可能可以执行网络操作或文件操作。但这些操作不一定可用。
当一个 SWF 加载另一个 SWF 时,uncaughtError
事件冒泡会再次在 LoaderInfo 层次结构中升降。例如,假设 A.swf 使用 Loader 实例加载 B.swf。如果 B.swf 中发生未被捕获的错误,则会将 uncaughtError
事件按以下顺序调度给 LoaderInfo 和 Loader 对象:
- (捕获阶段)A.swf 的 LoaderInfo
- (捕获阶段)A.swf 中的 Loader
- (目标阶段)B.swf 的 LoaderInfo
- (冒泡阶段)A.swf 中的 Loader
- (冒泡阶段)A.swf 的 LoaderInfo
Loader 对象的 uncaughtErrorEvents
属性永远不会在目标阶段调度 uncaughtErrorEvent
。它仅在捕获阶段和冒泡阶段调度该事件。
对于其他事件冒泡,调用 stopPropagation()
或 stopImmediatePropagation()
会停止将事件调度给任何其他侦听器,存在一个重要区别。为了进行事件传播,Loader 对象的 UncaughtErrorEvents 对象通常被视为与加载的 SWF 的 LoaderInfo.uncaughtErrorEvents
配对。如果向调用 stopPropagation()
方法的那些对象中的一个注册了某个侦听器,在事件传播结束之前,仍然会将事件调度给其他已向 UncaughtErrorEvents 对象注册的侦听器和已向其配对 UncaughtErrorEvents 对象注册的侦听器。stopImmediatePropagation()
方法仍然阻止将事件调度给所有其他侦听器。
如果内容在运行时的调试器版本(例如 Flash Player 或 AIR Debug Launcher (ADL) 的调试器版本)中运行,当发生未被捕获的错误时,会出现一个未被捕获的错误对话框。对于这些运行时版本,即使为 uncaughtError
事件注册了侦听器,仍会出现该错误对话框。在这种情况下,要防止出现该对话框,可调用 UncaughtErrorEvent 对象的 preventDefault()
方法。
如果 Loader 对象加载的内容是 AVM1 (ActionScript 2) SWF 文件,则 AVM1 SWF 文件中未被捕获的错误不会导致出现 uncaughtError
事件。此外,在 HTMLLoader 对象(包括 Flex HTML 控件)中加载的 HTML 内容中的 JavaScript 错误不会导致出现 uncaughtError
事件。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
bubbles : Boolean [只读]
表示事件是否为冒泡事件。 | Event | ||
cancelable : Boolean [只读]
表示是否可以阻止与事件相关联的行为。 | Event | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
currentTarget : Object [只读]
当前正在使用某个事件侦听器处理 Event 对象的对象。 | Event | ||
error : * [只读]
与未被捕获的错误相关联的错误对象。 | UncaughtErrorEvent | ||
errorID : int [只读]
包含与特定错误相关联的引用数字。 | ErrorEvent | ||
eventPhase : uint [只读]
事件流中的当前阶段。 | Event | ||
target : Object [只读]
事件目标。 | Event | ||
text : String
在 textInput 事件中,由用户输入的字符或字符序列。 | TextEvent | ||
type : String [只读]
事件的类型。 | Event |
方法 | 由以下参数定义 | ||
---|---|---|---|
UncaughtErrorEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = true, error_in:* = null)
创建包含有关 uncaughtError 事件的信息的 UncaughtErrorEvent 对象。 | UncaughtErrorEvent | ||
[覆盖]
创建 UncaughtErrorEvent 对象的副本,并将每个属性的值设置为与原始属性值相匹配。 | UncaughtErrorEvent | ||
用于在自定义 ActionScript 3.0 Event 类中实现 toString() 方法的实用程序函数。 | Event | ||
表示对象是否已经定义了指定的属性。 | Object | ||
检查是否已对事件调用 preventDefault() 方法。 | Event | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
如果可以取消事件的默认行为,则取消该行为。 | Event | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。 | Event | ||
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。 | Event | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
[覆盖]
返回一个字符串,其中包含 UncaughtErrorEvent 对象的所有属性。 | UncaughtErrorEvent | ||
返回指定对象的原始值。 | Object |
常量 | 由以下参数定义 | ||
---|---|---|---|
UNCAUGHT_ERROR : String = "uncaughtError" [静态]
定义 uncaughtError 事件对象的 type 属性的值。 | UncaughtErrorEvent |
error | 属性 |
error:*
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.1, AIR 2 |
与未被捕获的错误相关联的错误对象。通常情况下,此对象的数据类型为下列类型之一:
- Error 实例或它的一个子类 — 如果未被捕获的错误是由
throw
语句创建的同步错误(例如使用try..catch
块捕获的错误) - ErrorEvent 实例或它的一个子类 — 如果未被捕获的错误是在发生错误时调度错误事件的异步错误
但 error
属性可以是任何数据类型的对象。ActionScript 不要求仅将 throw
语句用于 Error 对象。例如,以下代码在编译时和运行时均是合法的:
throw new Sprite()
如果该 throw
语句未被 try..catch
块捕获,则 throw
语句会触发 uncaughtError
事件。在这种情况下,调度的 UncaughtErrorEvent 对象的 error
属性是在 throw
语句中构建的 Sprite 对象。
因此,在 uncaughtError
侦听器中,您应检查 error
属性的数据类型。以下示例对此检查进行了演示:
function uncaughtErrorHandler(event:UncaughtErrorEvent):void { var message:String; if (event.error is Error) { message = Error(event.error).message; } else if (event.error is ErrorEvent) { message = ErrorEvent(event.error).text; } else { message = event.error.toString(); } }
如果 error
属性包含一个 Error 实例(或 Error 子类),则可用的错误信息随正在运行内容的运行时版本的不同而异,具体信息如下:
在运行时的调试版(例如 Flash Player 或 AIR Debug Launcher (ADL) 的调试版)中:
Error.getStackTrace()
方法可返回导致错误的调用堆栈Error.message
包含完整的错误消息文本
在运行时的非调试版中:
Error.getStackTrace()
方法可返回导致错误的调用堆栈。但调用堆栈信息不包含源文件的文件名或行号。Error.message
属性包含简短的错误消息,通常是Error.errorID
和Error.name
属性的组合
在运行时的非调试版(Flash Player 11.4 或更低版本和 AIR 1.4 或更低版本)中:
Error.getStackTrace()
方法返回null
Error.message
属性包含简短的错误消息,通常是Error.errorID
和Error.name
属性的组合
Error 类的所有其他属性和方法在所有运行时版本中都可用。
请注意,如果 error
属性为 ErrorEvent 实例,将不再提供调用堆栈信息。
实现
public function get error():*
UncaughtErrorEvent | () | 构造函数 |
public function UncaughtErrorEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = true, error_in:* = null)
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.1, AIR 2 |
创建包含有关 uncaughtError 事件的信息的 UncaughtErrorEvent
对象。
type:String (default = NaN ) — 事件的类型。
| |
bubbles:Boolean (default = true ) — 确定 Event 对象是否参与事件流的冒泡阶段。事件侦听器可以通过继承的 bubbles 属性访问此信息。
| |
cancelable:Boolean (default = true ) — 确定是否可以取消 Event 对象。事件侦听器可以通过继承的 cancelable 属性访问此信息。
| |
error_in:* (default = null ) — 与未被捕获或未处理的错误(正常情况下为 Error 或 ErrorEvent 对象)相关联的对象。
|
clone | () | 方法 |
toString | () | 方法 |
UNCAUGHT_ERROR | 常量 |
public static const UNCAUGHT_ERROR:String = "uncaughtError"
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.1, AIR 2 |
定义 uncaughtError
事件对象的 type
属性的值。
注意:如果在 try 块中具有调用其事件处理函数的事件调度函数,则 catch 块不会捕获在事件处理函数中引发的错误。随后引发的任何错误可以通过侦听 LoaderInfo.uncaughtErrorEvents
来捕获。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | true |
cancelable | true ;取消此事件可防止在调试器运行时版本中出现未被捕获的错误对话框 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
error | 未被捕获的错误。 |
target | 与发生错误的 SWF 相关联的 LoaderInfo 对象。 |
text | 文本错误消息。 |
uncaughtError
事件处理程序来检测未被捕获的错误。此示例还提供了一个按钮,如果单击该按钮,将引发由未被捕获的错误处理程序捕获的错误。
在构造函数中,代码为由 LoaderInfo 对象的 uncaughtErrorEvents
属性调度的 uncaughtError
事件注册了一个侦听器。
在 uncaughtErrorHandler()
方法中,代码检查 error
属性的数据类型并做出相应的响应。
package { import flash.display.Sprite; import flash.events.ErrorEvent; import flash.events.MouseEvent; import flash.events.UncaughtErrorEvent; public class UncaughtErrorEventExample extends Sprite { public function UncaughtErrorEventExample() { loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); drawUI(); } 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 } } private function drawUI():void { var btn:Sprite = new Sprite(); btn.graphics.clear(); btn.graphics.beginFill(0xFFCC00); btn.graphics.drawRect(0, 0, 100, 50); btn.graphics.endFill(); addChild(btn); btn.addEventListener(MouseEvent.CLICK, clickHandler); } private function clickHandler(event:MouseEvent):void { throw new Error("Gak!"); } } }
<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" applicationComplete="applicationCompleteHandler();"> <fx:Script> <![CDATA[ import flash.events.ErrorEvent; import flash.events.MouseEvent; import flash.events.UncaughtErrorEvent; private function applicationCompleteHandler():void { 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 } } private function clickHandler(event:MouseEvent):void { throw new Error("Gak!"); } ]]> </fx:Script> <s:Button label="Cause Error" click="clickHandler(event);"/> </s:WindowedApplication>
uncaughtError
事件处理程序来检测未被捕获的错误。
在构造函数中,代码创建了一个 Loader 对象并为由 Loader 对象的 uncaughtErrorEvents
属性调度的 uncaughtError
事件注册了一个侦听器。
在 uncaughtErrorHandler()
方法中,代码检查 error
属性的数据类型并做出相应的响应。
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.ErrorEvent; import flash.events.UncaughtErrorEvent; import flash.net.URLRequest; public class LoaderUncaughtErrorEventExample extends Sprite { private var ldr:Loader; public function LoaderUncaughtErrorEventExample() { ldr = new Loader(); ldr.load(new URLRequest("child.swf")); ldr.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 } } } }
Tue Jun 12 2018, 11:04 AM Z