【问题标题】:dm-script catch error with "Analyze Particles"dm-script 用“分析粒子”捕获错误
【发布时间】:2018-01-11 17:15:28
【问题描述】:

做的时候

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

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

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

没有捕捉到错误。 “无效索引”错误可能是菜单操作“分析粒子”完成后的错误。谁能指出如何捕捉这个错误?找出这个错误的根源是一个很大的好处。我正在使用 GMS 1.84。

【问题讨论】:

    标签: dm-script


    【解决方案1】:

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

    我不相信在这种情况下有办法直接捕获这些异常。

    我不再使用 GMS 1.84,但我确实在 GMS 3.2 上进行了一些尝试,您可能还想这样做以更好地了解正在发生的事情。


    首先,您的 Try/Catch 循环是可以的,但是如果您没有在 catch 中放置“中断”,那么一旦离开了 catch 部分,异常将被提升到系统,即您经常想做的事:

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

    为了测试脚本如何处理来自被调用方法的异常,我首先编写了一个小脚本并将其“安装”为菜单命令,一次使用后台线程,一次不使用后台线程。我通过 Custom 菜单中的 File-menu 分别使用命令名称 BTnBT 安装了它们:

    // $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 或图像的显示或图像显示上的任何对象(ROI、掩码...)。

    我怀疑您的主脚本正在执行诸如关闭使用过的图像之类的操作?如果“分析”在单独的线程上,则您的主脚本可能太快或太慢,导致事情不同步。您可能需要在主脚本中添加人为暂停 (sleep()) 和更复杂的图像跟踪系统(使用 image-IDs )以避免此类事情。

    使用ChooseMenuItem() 是一种变通的破解解决方案,因此任何针对您的问题的错误预防解决方案都可能也是需要一些丑陋的“创造性”的代码破解。

    【讨论】:

    • 是的,我确实在一个线程中运行它以获得与直方图交互的能力。该错误与 imageDisplay 中的组件掩码有关。当我在那里退出程序时,只要我更改图像显示,该错误就会回来。该错误不会损害结果。我希望找到一种方法来消除该错误窗口并保持这个“被黑的快捷方式”工作而无需重新编码粒子分析。
    • @user6406828 在这种情况下,我认为您不能静默地抑制对话框。唯一的希望是首先防止异常,即找出并消除造成它的干扰。
    【解决方案2】:

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

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

    错误发生在第二次推荐。但它是由第一个表扬引起的。这应该是 GMS 1.84 的一个错误,其中“关闭”动作会使粒子索引不同步。注释掉第一个推荐(“关闭”操作)时,错误消失了。

    【讨论】:

    • 所以当您通过 UI 手动执行操作时,您会得到相同的错误(只是更早)?仅针对特定图像,还是始终?
    • 是的,它发生在使用 UI 的手动工作中。是的,仅针对特定图像。我正在批量做一个图像堆栈,它发生在大约 1/10 的图像上。内部 DM 代码可能会正确计算和消除某个像素或零像素区域。我可能会重新编码整个粒子分析以获得更好的控制。我试图将所有这些赞扬放在一个 TRY 块中。仍然没有发现那个错误。
    • 刚刚注意到删除“关闭”只会减少出错的机会。但它仍然会发生。我同意 BmyGuest,重复调用菜单项不是一个好的编码方法。要让脚本成为批处理工具,最好对粒子分析的核心有一个很好的控制。
    • 您介意张贴/链接一张这样的图片失败吗?我想看看自己发生了什么。至于重新编码:二进制事物(关闭等)可用作脚本命令,但实际粒子分析在脚本代码中可能太慢。至于 try/catch:它永远不会对在不同线程上抛出的异常起作用。
    猜你喜欢
    • 2016-10-26
    • 2012-08-01
    • 2014-10-30
    • 2012-12-28
    • 2021-06-10
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多