try-catch不工作?

时间:2009-04-01 09:59:30

标签: flash actionscript-3 error-handling try-catch

我在以下的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,但它适用于常规事件监听器?

3 个答案:

答案 0 :(得分:7)

IOErrors / NetworkErrors是异步错误。当导致它们的方法被称为正常运行时错误时,它们不会被抛出。否则执行必须完全停止,直到(例如)文件完全加载...

答案 1 :(得分:6)

  

基本上,因为呼叫是异步的   try..catch..finally阻止不会对你   好一点豆子。这需要一段时间   为装载程序确定网址是   坏,然后它发送   IO_ERROR事件。    - http://www.mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

Theo是对的;我只想添加使用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);
}

如果您使用的是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);
}

答案 2 :(得分:0)

今天我发现有一个名为 log.as 的课程是个坏主意。 从这个类抛出的错误不会陷入try-catch。

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

可能是旧版SDK的特例,或者是关于我的构建环境的特定内容。

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