문제

디버그 플래시 플레이어에서 Flex 애플리케이션을 실행할 때 예상치 못한 일이 발생하자마자 예외 팝업이 표시됩니다.그러나 고객이 애플리케이션을 사용할 때 디버그 플래시 플레이어를 사용하지 않습니다.이 경우 예외 팝업이 표시되지 않지만 UI가 작동하지 않습니다.

따라서 지원 가능성 때문에 Flex UI 어디에서나 발생할 수 있는 예외를 포착하고 Flex 내부 팝업에 오류 메시지를 표시하고 싶습니다.Java를 사용하면 전체 UI 코드를 try/catch 블록에 캡슐화할 수 있지만 Flex의 MXML 애플리케이션을 사용하면 이러한 일반적인 try/catch를 어디에서 수행할 수 있는지 알 수 없습니다.

도움이 되었습니까?

해결책

Flex 3에서는 포착되지 않은 예외에 대해 알림을 받을 수 있는 방법이 없습니다.Adobe는 문제를 알고 있지만 해결 방법을 만들 계획인지는 모르겠습니다.

현재의 유일한 해결책은 try/catch를 논리적인 위치에 배치하고 이를 전달하는 모든 항목에 대해 ERROR(또는 웹 서비스의 경우 FAULT) 이벤트를 수신하고 있는지 확인하는 것입니다.

편집하다: 게다가 이벤트 핸들러에서 발생하는 오류를 포착하는 것도 실제로 불가능합니다.나는 벌레 Adobe 버그 시스템에서.

2010-01-12 업데이트: 이제 전역 오류 처리가 다음에서 지원됩니다. 플래시 10.1 그리고 에어 2.0 (둘 다 베타 버전), 구독을 통해 달성됩니다. 발견되지 않음_ERROR 이벤트 LoaderInfo.uncaughtErrorEvents.다음 코드는 livedocs의 코드 샘플:

public class UncaughtErrorEventExample extends Sprite
{
    public function UncaughtErrorEventExample()
    {
        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
        }
    }

다른 팁

Adobe 버그 관리 시스템에 이에 대한 버그/기능 요청이 있습니다.그것이 당신에게 중요하다면 투표하세요.

http://bugs.adobe.com/jira/browse/FP-444

Flex 3.3에서 작동합니다.

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

버그 FP-444(위)는 다음에 연결됩니다. http://labs.adobe.com/technologies/flashplayer10/features.html#developer 2009년 10월 이후 이것이 10.1부터 가능하다는 것을 보여주었고 현재 2009년 10월 28일은 아직 출시되지 않았습니다. 따라서 출시되면 그것이 사실인지 확인할 수 있을 것 같습니다.

try-catch를 사용하여 허용되는 답변의 대안입니다.느리지만 읽기에는 더 간단하다고 생각합니다.

try {
    loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
} catch (e:ReferenceError) {
    var spl:Array = Capabilities.version.split(" ");
    var verSpl:Array = spl[1].split(",");

    if (int(verSpl[0]) >= 10 &&
        int(verSpl[1]) >= 1) {
        // This version is 10.1 or greater - we should have been able to listen for uncaught errors...
        d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
    }
}

물론 이 코드를 성공적으로 컴파일하려면 최신 10.1 playerglobal.swc를 사용해야 합니다.http://labs.adobe.com/downloads/flashplayer10.html

저는 플렉스4를 사용하고 있습니다.나는 노력했다 loaderInfo.UncaughtErrorEvents, 하지만 loaderInfo가 초기화되지 않아 null 참조 오류가 발생했습니다.그럼 나는 시도했다 root.loaderInfo.UncaughtErrorEvents 그리고 같은 이야기.나는 노력했다 sprite.root.UncaughtErrorEvents, 그런데 스프라이트 객체가 없어서 하나 만들었지만 작동하지 않았습니다.마침내 나는 시도했다

systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);

그리고 그것은 마술처럼 작동합니다.확인하다 이것

Flex 3.5 및 Flash Player 10에서 작동합니다.

<?xml version="1.0" encoding="utf-8"?>

        protected function application1_addedToStageHandler(event:Event):void{              
            if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
                IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
            }

            sdk.text = "Flex " + mx_internal::VERSION;
        }

        private function uncaughtErrorHandler(e:*):void{
            e.preventDefault();

            var s:String;

            if (e.error is Error)
            {
                var error:Error = e.error as Error;
                s = "Uncaught Error: " + error.errorID + ", " + error.name + ", " + error.message;
            }
            else
            {
                var errorEvent:ErrorEvent = e.error as ErrorEvent;
                s = "Uncaught ErrorEvent: " + errorEvent.text;
            }

            msg.text = s;
        }

        private function unCaught():void
        {
            var foo:String = null;
            trace(foo.length);
        }
    ]]>
</mx:Script>
<mx:VBox>
    <mx:Label id="sdk" fontSize="18"/>
    <mx:Button y="50" label="UnCaught Error" click="unCaught();" />
    <mx:TextArea id="msg" width="180" height="70"/>
</mx:VBox>

감사해요

나는 나에게 도움이 되는 '루트'에 이벤트 리스너를 연결했습니다.

sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

디버그 Flash Player에서는 여전히 오류가 발생하지만 디버그가 아닌 버전에서는 오류가 Flash Player의 대화 상자에 표시되고 핸들러가 응답합니다.대화 상자가 나타나지 않게 하려면 다음을 추가하십시오.

event.preventDefault();

그래서:

    private function onUncaughtError(event:UncaughtErrorEvent):void
    {
        event.preventDefault();
        // do something with this error
    }

저는 이것을 AIR에서 사용하고 있었지만 표준 AS3 프로젝트에서도 작동한다고 가정합니다.

이제 로더 정보를 사용하여 다음을 수행할 수 있습니다.

http://www.adobe.com/devnet/flex/articles/global-Exception-handling.html

점검:loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top