2011-05-16 118 views
1

我正在嘗試使用新的(ish)AS3全局錯誤處理類。我試圖在Flex mxml應用程序中使用它。我無法讓它工作。以下是顯示問題的完整程序。我將其設置爲使用Flash Player 10.2並使用Flex 4.5 SDK進行編譯。Flex 4.0/4.5全局錯誤處理

我已經嘗試過使用Flex SDK 4.0和4.5,但在任何情況下都會出現錯誤。我必須在這裏忽略一些明顯的東西。這是一個普通的Flex SWF文件,將在網頁上顯示。假設我可以導入UncaughtErrorEvent,然後,我會做這樣的事情來設置事件處理程序:

if(systemManager.loaderInfo.hasOwnProperty("uncaughtErrorEvents")) {     
     IEventDispatcher(
      systemManager.loaderInfo["uncaughtErrorEvents"]).addEventListener(
       "uncaughtError", uncaughtErrorHandler); 
    } 

這一切似乎可怕的缺憾,但我可以忍受的不同之處在於它不工作!我搜索了網頁,找不到任何文檔或示例來解釋如何在我的上下文中進行此項工作。有什麼建議?

完整的程序:從API(我建議你通過下一次看)

<?xml version="1.0" encoding="utf-8"?> 
    <s: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" minWidth="955" minHeight="600" applicationComplete="onApplicationComplete();" 
        > 
     <fx:Declarations> 
      <!-- Place non-visual elements (e.g., services, value objects) here --> 
     </fx:Declarations> 
     <fx:Script> 
      <![CDATA[ 
       private function onApplicationComplete() : void { 
        systemManager.loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", uncaughtErrorHandler); 
       } 
       private function uncaughtErrorHandler(event:Event) : void { 
        trace(event.toString()); 
       } 
      ]]> 
     </fx:Script> 
     <s:Button x="153" y="64" label="Trigger Error" id="triggerButton" click="throw new Error('myError')"/> 
    </s:Application> 
+0

嘗試使用stage.loaderInfo而不是systemManager? http://stackoverflow.com/questions/3315904/global-error-handler-for-flash-player-10-1-not-working – Satish 2011-05-16 23:17:29

+0

嗯,那個線程只是確認我遇到的問題。無論我使用哪個loaderInfo addEventListener,它都不起作用。 – 2011-05-17 11:22:10

回答

2

採取:

<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> 
+0

哇,沒什麼更糟的是,粗魯的迴應!很明顯,我確實閱讀過文檔,因爲我的代碼是直接從他們中刪除的。這是行不通的。正如你從其他線索看到的,我並不孤單。我在閱讀API文檔並嘗試了至少5個來自各種博客的其他建議後才發佈。功能或所有文檔都有問題。我有一個30行完整的程序,顯示這不起作用。 – 2011-05-17 11:23:40

+0

我很好奇:你有沒有試過你的代碼?首先,它沒有編譯。我不得不將WindowedApplication改爲Application。然後我必須將目標FP設置爲10.1。然後它編譯,但給出了我的代碼的確切結果。你的程序中也存在邏輯錯誤。它需要在錯誤處理程序中調用event.preventDefault()。所以我認爲你對文檔過分信任,因爲我嘗試了每個我能找到的例子,而且沒有按預期工作。我仍然試圖弄清楚爲什麼你的結論是我沒有閱讀API文檔,因爲我的例子幾乎與API參考文獻中的相同。 – 2011-05-17 11:34:50

+0

粗魯的迴應?我只是說你應該看看API。如果你做了,對你有好處,但你沒有提到它或顯示相同的代碼。是的,我確實嘗試過,如果你遵循文檔(WindowedApplication是Air,API說minium FP是10.1),那麼它工作得很好。它不需要*來調用preventDefault(),如果你不想讓一個錯誤框彈出,那就是一個附加值。但是,這裏顯示的例子完美地工作。 – 2011-05-17 12:02:07

3
<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/mx" 
          uncaughtError="uncaughtErrorHandler(event)" /> 

最簡單的方法...