套件 | 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, 03:47 PM Z