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/

西奥是正确的;我只会添加使用包的IOErrorEventflash.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);
}

如果您使用的是 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);
}
于 2009-04-01T19:31:23.933 回答
0

今天我发现有一个名为log.as的类是个坏主意。此类抛出的错误不会在 try-catch 中捕获。

我认为他们以前很好。我一直在使用带有预期错误的单元测试的 FlexUnit。我安装了 AIR SDK 2.7,最近添加了可能引发冲突的 AIR SDK 2.01(用于另一个项目)。

可能是旧 SDK 的一个极端案例,或者是关于我的构建环境的某些特定情况。

重命名课程为我解决了这个问题。

于 2013-11-11T18:04:02.303 回答