Flex에서 모든 예외를 어떻게 포착하나요?
-
01-07-2019 - |
문제
디버그 플래시 플레이어에서 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 버그 관리 시스템에 이에 대한 버그/기능 요청이 있습니다.그것이 당신에게 중요하다면 투표하세요.
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.
}