dm-script捕获错误“分析粒子”

时间:2018-01-06 02:12:36

标签: dm-script

做的时候

ChooseMenuItem("Analysis", "Particles", "Analyze Particles") 

我有时会得到“无效索引”错误窗口。有没有办法捕捉到这个错误? 这样做,

try {
    ChooseMenuItem( "Analysis", "Particles", "Analyze Particles" )
}
catch {
    okdialog("error")
}

没有发现错误。菜单操作“分析粒子”完成后,“无效索引”错误可能是错误。任何人都可以指出如何捕获此错误?找出这个错误的起源是一个很大的优点。我正在使用GMS 1.84。

2 个答案:

答案 0 :(得分:2)

  

我认为您遇到的问题是粒子分析在一个单独的后台线程上运行(至少部分)。   

我不相信在这种情况下有办法直接捕捉这些例外情况。

我不再使用GMS 1.84,但我确实在GMS 3.2上尝试了一些你可能也想做的事情,以便更好地理解正在发生的事情。

首先,你的Try / Catch循环没问题,但如果你没有进行“休息”。在捕获中,一旦捕获部分被留下,那么异常将被提升到系统,即你经常想做的事情:

Try{ 
    ... }
Catch{
    ...
    break
}
...

为了测试脚本在被调用方法的异常中的行为方式,我首先编写了一个小脚本并安装了'它作为菜单命令,一次使用,一次没有背景线程。我通过 Custom 菜单中的文件菜单安装了它们,命令名分别为 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.")

然后我使用了&#39; ChooseMenuItem()&#39;在以下脚本中进行测试:

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命令启动的例程在主线程上启动,则执行该呼叫会阻止&#39;主脚本,直到它完成 - 无论是在它的结尾,还是它抛出和异常。主脚本正确捕获异常并打印结果。
  •   
  • 如果ChooseMenuItem命令启动的例程在单独的(后台)线程上启动,则主脚本会立即继续。 ChooseMenuItem一次成功返回(如果它可以启动命令),则退出Try / Catch循环。调用例程在后台线程上抛出的任何异常都不会被捕获。
  •   
  

关于错误的起源:&#34;无效索引&#34;消息指向主脚本被删除(或保留在范围内)的某个对象,该脚本应该被被调用的后台例程存在(或不再存在)。这可以是imageDisplay上的图像或imageDocument或图像或任何对象(ROI,mask ...)的显示。

我怀疑你的主要脚本是否会像关闭图像一样使用?如果&#34;分析&#34;在一个单独的线程上,您的主脚本可能太快或太慢而导致事情不同步。您可能需要在主脚本中添加人工暂停(sleep())和更复杂的跟踪图像的系统(使用 image-IDs )以避免此类事件。

使用ChooseMenuItem()是一种解决方法的黑客解决方案,因此针对您的问题的任何防止错误的解决方案都可能是代码破解,其中包含一些丑陋的创造性&#39;需要的。

答案 1 :(得分:1)

找到了部分答案。 我有两个表扬ChooseMenuItem("Analysis","Particles","Analyze Particles")

ChooseMenuItem("Analysis", "Particles", "Close") 
ChooseMenuItem("Analysis", "Particles", "Find Particles") 

错误发生在第二个推荐。但它是由第一个赞扬引起的。这应该是GMS 1.84的一个错误,其中“关闭”动作抛出粒子索引不同步。在评论出第一个推荐(“结束”行动)时,错误消失了。