为什么我的例外被抓住了?

时间:2015-08-30 22:42:27

标签: actionscript-3 air

这是我得到的堆栈跟踪:

[Fault] exception, information=Error: Directory id 3 already in use
at cantrips.assets.index::AssetIndex/dirIdChanged()[/home/luismasuelli/Proyectos/flash-assets-index-ritual/assets-index-loader/src/cantrips/assets/index/AssetIndex.as:72]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at cantrips.assets.index::AssetDirectory/set id()[/home/luismasuelli/Proyectos/flash-assets-index-ritual/assets-index-loader/src/cantrips/assets/index/AssetDirectory.as:68]
at Main/updateSelectedDirectory()[/home/luismasuelli/Proyectos/flash-assets-index-ritual/assets-index-editor/src/Main.mxml:192]
at Main/__dirUpdateCurrent_click()[/home/luismasuelli/Proyectos/flash-assets-index-ritual/assets-index-editor/src/Main.mxml:401]

这是Main / updateSelectedDirectory()的实现:

    private function updateSelectedDirectory():void {
        try {
            var newId:uint = uint(dirId.text);
            var newName:String = StringUtil.trim(dirName.text);
            var selectedDirectory:AssetDirectory = assetBrowserTree.selectedItem as AssetDirectory;
            if (selectedDirectory) {
                selectedDirectory.id = newId;
                selectedDirectory.name = newName;
                assetBrowserTree.expandItem(selectedDirectory.parent, false);
                assetBrowserTree.expandItem(selectedDirectory.parent, true);
            }
        } catch (error:Error) {
            Alert.show(error.message, "Cannot update");
        }
    }

为什么try {} catch(error:Error) {}没有抓住异常?

异常是由我创建的异常,其中有一个被理解的场景,它被触发(我创建了异常并设计了这些场景,我正在测试它们;异常按照我的预期被触发)。我也尝试在catch块中使用异常的确切名称(AssetIndexError),并且不存在混淆或不明确的名称(这意味着:在其他地方没有声明我可以导入的另一个AssetIndexError类而不是这个)。 / p>

说明:

  • cantrips.assets.index是我可以控制的代码。
  • Main / *是主窗口。我也控制了那段代码。

截图:

Screenshot

2 个答案:

答案 0 :(得分:1)

如果查看堆栈,您会看到错误没有被显示在显示的代码中(靠近堆栈的底部),但是在这里:

  

dirIdChanged AssetIndex.as:72

在堆栈的下方,你会看到以下内容:

  

at flash.events::EventDispatcher/dispatchEvent()

这意味着堆栈在AssetDirectory.set id()和之间是异步的 AssetIndex.dirIdChanged()

当您添加事件处理程序时,当前块中的所有代码通常都会在事件处理程序代码之前运行(因为它们不在同一个线程中)。

因此,在这种情况下,try/catch中的所有代码都将在事件处理程序的代码之前运行 - 这就是错误未被捕获的原因。

无论何时处理事件,都需要进行另一次try / catch,或使用异步错误处理技术。

答案 1 :(得分:0)

这是OP对接受的答案的补充。

这个问题的主要原因是我不明白事件流程是如何完成的。

事件流是异步的,我认为它是同步的。如果事件流是同步的,不难想象我的意图是正确的:异常可以抛出在同一个执行堆栈中,一切都会好的(即一个方法调用另一个方法,这样的方法调用第三个方法,等等等等和爆炸)。

当事件流与ActionScript流异步时,异常将在另一个执行堆栈中触发,但不知何故,所提供的信息具有误导性,因为它应该像执行堆栈相同

我实现的解决方案:一个哑对象(即一个愚蠢的新类),其作用类似于EventDispatcher但是同步:.dispatch()不会事件执行发布到事件流中,而是自己执行已注册的事件处理程序,作为处理程序的循环,并手动调用每个处理程序,而不会在处理程序中填充event.target之类的内容。

虽然从我认为的许多观点来看,这个设计可能被认为是坏的,在这种情况下,它符合我的处理程序需求,抛出异常和同步执行的代码。