2

次の Actionscript 3 コードで 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が、エラーは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のに、通常のイベント リスナーでは機能するのはなぜですか?

4

3 に答える 3

7

IOErrors/NetworkErrors は非同期エラーです。それらを引き起こしたメソッドが通常の実行時エラーとして呼び出された場合、それらはスローされません。そうしないと、(たとえば)ファイルが完全にロードされるまで、実行を完全に停止する必要があります...

于 2009-04-01T10:25:27.490 に答える
6

基本的に、呼び出しは非同期であるため、try..catch..finally ブロックはあまり役に立ちません。ローダーが URL が不正であると判断するにはしばらく時間がかかり、その後 IO_ERROR イベントが送出されます。- http://www.mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

テオは正しいです。メソッドを知らない人のためIOErrorEventに、パッケージのクラスを使用してこれを処理するように追加するだけです。flash.events

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);
}

URLLoader ではなく Loader オブジェクトを操作する場合は、次のように 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);
}
于 2009-04-01T19:31:23.933 に答える