2014-09-18 5 views
0

, 나는 같은 시도-catch 블록했습니다 :이 표시 목록에 (안 스프라이트,도 어떤 종류의 DisplayObject) 아닌 내부 클래스를 발생 ,하지만 를 확장 EventDispatcher. 이러한 클래스는 외부에서로드 된 SWF에 있습니다 (중요한 경우).ActionScript3에서 디스패치 한 ErrorEvent를 잡는 방법은 무엇입니까? 내 응용 프로그램에서 몇 가지 포인트에서

루트 클래스에서
try { 
    ... some logic that may throw Error 
} catch (e:Error) { 
    var errorEvent:ErrorEvent = new ErrorEvent(ErrorEvent.ERROR, true); 
    errorEvent.text = e.getStackTrace(); 
    dispatchEvent(errorEvent); 
} 

, 이것은 내가 무엇을 가지고 :

loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtErrorHandler); 
loaderInfo.uncaughtErrorEvents.addEventListener(ErrorEvent.ERROR, onErrorEventHandler); 
stage.addEventListener(ErrorEvent.ERROR, onErrorEventHandler); 

protected function onUncaughtErrorHandler(event:UncaughtErrorEvent):void 
{ 
    var message:String; 
    if (event.error is Error) { 
     message = event.error.getStackTrace(); 
    } else if (event.error is ErrorEvent) { 
     message = ErrorEvent(event.error).text; 
    } else { 
     message = event.error.toString(); 
    } 

    trace(message); 
} 

protected function onErrorEventHandler(event:ErrorEvent):void 
{ 
    trace(event.text); 
} 

어느 핸들러가 호출되지만, 그 오류 이벤트 거품까지 내가 콘솔에서 볼 및 디버그 모드에서 팝업으로, 하지만 어떻게 그걸들을 수 있습니까 루트 클래스?

오류는 주 스레드 또는 특정 비즈니스 논리의 실행을 중단시키지 않기 때문에이 작업을 수행합니다.

+0

하여 addEventListener :

FlashPro의 다음 작품 LDMS BY

this.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onGlobalErrors); 

편집 : 여기에 귀하의 루트 클래스에 추가하는 예입니다? –

+0

@WillKru 글쎄, 루트 클래스에서 듣고 싶습니다. 질문을 편집했습니다. –

+1

'버블 링'을 연구하고 어떻게 작동하는지 [actionscript에서 오류 처리] (http://www.adobe.com/ devnet/actionscript/articles/event_handling_as3.html) 적절한 오류 처리를 완전히 이해하기 위해 –

답변

0

클래스에 스테이지가있는 경우 ErrorEvent.ERROR에 이벤트 리스너를 추가 할 수 있습니다. 파견 된 이벤트는 모든 부모를 통해 stage까지 올라갑니다. 코드의

예 :

// some initialize 
stage.addEventListener("lol", lolHandler); 
// dispatching 
private function button1_clickHandler(event:MouseEvent):void 
{ 
    // second parameter responsible for bubbling and MUST be true 
    dispatchEvent(new Event("lol", true)); // on mouseClick we dispatch custom event 
} 

private function lolHandler(event:Event):void 
{ 
    trace("We got it! Lol!); 
} 

P.S. 의견의 기사는 정말 유용합니다. 그것을 읽을 것을 권장합니다.

// UPDATE

대체 변종은 일부 싱글에서 이벤트를 전달 될 수 있습니다. 예 :

public class ErrorHandler extends EventDispatcher { 
     private static var _instance:ErrorHandler; 

     public static function get instance():ErrorHandler { 
      if (!_instance) 
       _instance = new ErrorHandler(new PrivateConstructor()); 

      return _instance; 
     } 

     public function ErrorHandler(value:PrivateConstructor) { 
      addEventListener(ErrorEvent.ERROR, errorHandler); 
     } 

     private function errorHandler(event:ErrorEvent):void { 
      // some code 
     } 
    } 
} 
class PrivateConstructor {} 

.... and dispatching 
ErrorHandler.instance.dispatchEvent(new ErrorEvent()); 
+0

클래스를 내가 디스패치 이벤트가 디스플레이 목록에 없으므로 무대 –

+0

, 내 대답을 업데이 트 plz, 어쩌면 도움이 – Crabar

+0

그래, Crabar이 작동하지만, 우리가 사용할 수 있지만, AS3의 이벤트 버블 링 기능 다른 모든 것이 실패하면 이는 해결책이 될 수 있습니다. 고맙습니다! –

1

나는 당신이 찾고있는 것이 잡히지 않은 오류 이벤트를 청취하는 것이라고 생각합니다.

loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,function(e:Event){ 
    trace("I Caught an Error"); 
}); 

var err:ErrorEvent = new ErrorEvent(ErrorEvent.ERROR,true); 

var obj:EventDispatcher = new EventDispatcher(); 

obj.dispatchEvent(err); 
+0

Loader 또는 URLLoader를 통해 파일을로드 할 때 EventError가 발생하지 않기 때문에 이미 언급 한 것처럼 작동하지 않습니다. 이러한 오류는 loaderInfo, yes를 통해 처리되지만이 오류는 발생하지 않습니다. 왜 +1? –

+0

@ MartinsAsenov - 틀렸어. 이 상황을 처리하는 가장 좋은 방법이기 때문에 +1을했습니다. – BadFeelingAboutThis

+1

LoaderInfo 객체에는로드 된 SWF 파일에 대한 많은 데이터가 포함되어 있습니다. 이 경우 루트 클래스, 즉 전체 SWF의 loaderInfo에 액세스하고 있습니다. 그것이 처리되지 않은 오류를 잡는 이유입니다. http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/display/LoaderInfo.html#uncaughtErrorEvents –