我在以下的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
,但它适用于常规事件监听器?
答案 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的特例,或者是关于我的构建环境的特定内容。
重命名课程为我解决了问题。