2009-04-01 4 views
2

다음 tryscript 3 코드에서 try-catch 블록을 사용하고 있습니다.try-catch가 작동하지 않습니까?

try { 
    this._subtitle = new SubtitleController(subtitlePath, _framerate); 
    this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded); 
} 
catch (e:Error) { 
    trace('subtitle not found'); 
} 

SubtitleController 생성자는 subtitlePath을로드하려고 시도하고 Error #2044: Unhandled ioError을 throw하지만 try 문은 ​​오류를 포착하지 않습니다. 오류는 단순히 try 문이 존재하지 않는 것처럼 던져집니다.

물론, 그 코드를

this._subtitle.addEventListener(IOErrorEvent.IO_ERROR, function (ev:Event) { trace('subtitle not loaded'); }); 
this._subtitle = new SubtitleController(subtitlePath, _framerate); 
this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded); 

로 대체 할 수 있습니다. 거의 작동하지만 그 오류를 멈추지 않고 대신 다른 것을 던집니다.

그러나 try-catch 블록의 전체 지점이 그렇게하지 못합니까? try-catch에서 작동하지 않는 이유는 무엇입니까?하지만 일반 이벤트 수신기에서 작동합니까?

+0

adobe가 만드는 액션 스크립트 라이브러리는 정말 못 생기고, 여러 가지 유형의 '이벤트 처리기'패턴과 예외가 매우 복잡해 보입니다. 예외/오류는 이벤트와 대개 원래의 호출에서 자주 방송되는 것처럼 보입니다. . – meandmycode

답변

7

IOErrors/NetworkErrors는 비동기 오류입니다. 이러한 메소드를 호출하는 메소드가 정상적인 런타임 오류라고 불릴 때 발생하지 않습니다. 그렇지 않으면 실행은 통화가 비동기이기 때문에 기본적으로

+1

아 .. 지금 당장 말이야. 그래서 다른 오류가 I/O 및 네트워크 오류를 예상 할 경우 제대로 작동해야합니다. – evilpenguin

6

... 파일이 완전히로드 (예를 들어)은 try..catch..finally 블록은하지 않을 것입니다 때까지 완전히 중지 한 것 너 콩 좋은. 로더가 URL을 확인하기 위해 이 잠시 동안 걸리고 이 불량한 다음 IO_ERROR 이벤트를 전달합니다. - http://www.mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

테오가 정확합니다. 나는 단지 패키지의 IOErrorEvent 클래스를 사용하여 메소드를 모르는 사람들을 위해이를 처리 할뿐입니다.

var loader:URLLoader = new URLLoader(); 
loader.load(new URLRequest("test.mp3")); 
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
function onIOError(e:IOErrorEvent):void 
{ 
    trace("An IO Error has occured.\n\n", e); 
} 

Loader 객체가 아닌은 URLLoader와 함께 작업, 당신은 다음과 같이 Loader 객체의 contentLoaderInfo 속성을 청취 할 필요가 있음을 기억한다면

.

var loader:Loader = new Loader(); 
addChild(loader); 

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
loader.load(new URLRequest("path/to/asset")); 

function onIOError(e:IOErrorEvent):void 
{ 
    trace("An IO Error has occured.\n\n", e); 
} 
0

오늘은 나쁜 생각입니다 log.as라는 클래스를 가진 발견했다. 이 클래스에서 발생하는 오류는 try-catch에서 catch하지 않습니다.

전 괜찮다고 생각합니다. 저는 FlexUnit을 사용하여 단위 테스트에서 오류가 예상됩니다. AIR SDK 2.7이 설치되어 있고 충돌을 일으킨 AIR SDK 2.01 (다른 프로젝트 용)이 최근에 추가되었습니다.

오래된 SDK 또는 내 빌드 환경과 관련된 구체적인 사례 일 수 있습니다.

클래스 이름을 변경하면 문제가 해결되었습니다.

관련 문제