在做的时候
ChooseMenuItem("Analysis", "Particles", "Analyze Particles") 我有时会收到"Invalid index“错误窗口。有没有办法捕捉到这个错误?这样做,
try {
ChooseMenuItem( "Analysis", "Particles", "Analyze Particles" )
}
catch {
okdialog("error")
}不会捕获错误。"Invalid index“错误很可能是在菜单操作”分析粒子“完成后出现的错误。有谁能指出如何捕捉这个错误吗?找出这个错误的根源是一个很好的加分。我使用的是GMS 1.84。
发布于 2018-01-06 17:54:11
我认为你遇到的问题是粒子分析(至少部分)是在单独的后台线程上运行的。在这种情况下,我不认为有办法直接捕获这些异常。
我不再使用GMS 1.84,但我在GMS 3.2上尝试了一些东西,你可能也想这样做,以便更好地了解发生了什么。
首先,你的Try/Catch循环是可以的,但是如果你不在catch中放一个'break‘,那么一旦catch-section被留下,异常仍然会被提升到系统中,也就是你经常想要做的事情:
Try{
... }
Catch{
...
break
}
...为了测试脚本如何处理来自被调用方法的异常,我首先编写了一个小脚本,并将其作为菜单命令“安装”,一次使用后台线程,一次不使用后台线程。我通过自定义菜单中的文件菜单安装了它们,命令名分别为BT和nBT:
// $BACKGROUND$
Result( "\nStart and wait" )
number i = 0
while( i < 100 ){
i++
sleep(0.05)
if ( ShiftDown() ) break
if ( OptionDown() ) Throw("Broken")
Result( "." )
}
Result("\nDone and exit.")和
Result( "\nStart and wait" )
number i = 0
while( i < 100 ){
i++
sleep(0.05)
if ( ShiftDown() ) break
if ( OptionDown() ) Throw("Broken")
Result( "." )
}
Result("\nDone and exit.")然后我使用'ChooseMenuItem()‘在下面的脚本中进行测试:
string name = TwoButtonDialog("Background threaded?", "yes", "no" ) ? "BT" : "nBT"
number success = 0
Try{
Result( "\n Calling: " + name )
success = ChooseMenuItem("Custom","",name)
}
catch
{
Result("\n Caught exception." )
break
}
result("\n Success: " + success )使用这种组合进行测试(并使用Alt键在例程中抛出异常),我可以验证命令的行为是否符合预期的
ChooseMenuItem命令启动的例程是在主线程上启动的,则该调用的执行将“阻止”主脚本,直到它完成-要么在它结束时,要么在它抛出异常时。主脚本会正确捕获异常并打印结果。ChooseMenuItem命令启动的例程是在单独的(后台)线程上启动的,则主脚本将立即继续。ChooseMenuItem立即成功返回(如果它可以启动命令),并退出Try/Catch循环。在后台线程上被调用的例程抛出的任何异常都将不再被捕获。对于错误的来源,索引无效:“
”消息指向某个对象被主脚本移除(或保留在作用域中),而被调用的后台例程期望该对象存在(或不再存在)。这可以是图像或imageDocument,也可以是图像或任何对象(感兴趣区域、蒙版...)的显示。在imageDisplay上。
我怀疑你的主脚本正在做一些事情,比如关闭曾经使用过的图片?如果“分析”是在一个单独的线程上,你的主脚本可能太快或太慢,并使事情失去同步。您可能需要在主脚本中添加人工暂停(sleep())和更复杂的跟踪图像(使用图像ID)的系统,以避免发生这种情况。
使用ChooseMenuItem()是一种变通的黑客解决方案,所以针对您的问题的任何防止bug的解决方案很可能也是一个需要一些丑陋的“创造性”的代码黑客。
发布于 2018-01-07 09:35:02
找到了部分答案。我有两个建议进行ChooseMenuItem("Analysis","Particles","Analyze Particles"),
ChooseMenuItem("Analysis", "Particles", "Close")
ChooseMenuItem("Analysis", "Particles", "Find Particles") 在第二次推荐时发生错误。但它是由第一个表扬引起的。这应该是GMS 1.84的一个bug,其中“关闭”动作会抛出粒子索引不同步。当注释掉第一个推荐(“关闭”动作)时,这个错误就消失了。
https://stackoverflow.com/questions/48123649
复制相似问题