2009-04-01 13 views
2

私は次のActionScript 3のコードでtry-catchブロックを使用しています:SubtitleControllerコンストラクタは、subtitlePathをロードしようとError #2044: Unhandled ioErrorをスローしますが、エラーがtry文によって捕捉されないtry-catchが機能しませんか?

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

。エラーは単に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); 

でそのコードを置き換えることができますし、それはほとんど動作しますが、それはそのエラーをtrowing停止し、代わりに別のものをスローします。

しかし、それを行うにはtry-catchブロックの全体のポイントではありませんか?なぜそれはtry-catchでは機能しませんが、通常のイベントリスナーでは機能しますか?

+0

adobeが作ったactionscriptライブラリは実際には醜いですが、複数のタイプの 'イベントハンドラ'パターンと例外が非常にうまくいきます。例外/エラーは、イベントに対して頻繁にブロードキャストされるようです。 – meandmycode

答えて

7

IOErrors/NetworkErrorsは非同期エラーです。それらを引き起こすメソッドが通常の実行時エラーと呼ばれるときにスローされません。そうでなければ、実行は、コールが 非同期(async)であるため、基本的に

+1

ああ、今は意味があります。だから私は/ Oとネットワークのエラーを期待する他のエラーのために、それは正常に動作するはずですか? – evilpenguin

6

...ファイルが完全にロードされている(例えば)、try..catch..finallyブロックはしないだろうまで完全に停止している必要がありますあなた 良いの豆ビット。ローダーが というURLを判別するまでには がかかり、次に IO_ERRORイベントが送出されます。 - http://www.mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

Theoは正しいです。私は、パッケージの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で捕捉されません。

以前は大丈夫だったと思います。 私はFlexUnitを使用して、エラーが予想されるユニットテストを行ってきました。 私はAIR SDK 2.7をインストールしましたが、最近競合を起こしたAIR SDK 2.01(別のプロジェクト用)を追加しました。

古いSDKや私のビルド環境に特有のもののコーナーケースかもしれません。

クラスの名前を変更すると、私の問題が解決しました。

関連する問題