csol转圈吧 关注:92贴子:750
  • 7回复贴,共1

【CSOL 集成工具使用进阶】第一节:使用错误处理功能变更执行流

只看楼主收藏回复

有关 CSOL 集成工具编程接口的详细信息,参见 CSOL 集成工具开发者参考文档 https://blog.macrohard.fun/CSOL-Utilities/
截至本帖发布是,我尚在进行开发文档撰写工作,集成工具目前最新版(v1.5.1 预览版)尚未适用文档中所述全部特性,这些特性将会在即将发布的正式版中提供。


IP属地:江苏1楼2025-03-02 22:35回复
    CSOL 集成工具中的执行器每隔一段时间从命令文件中取出由控制器下达的命令。有时,执行器执行某一命令(如创建新房间、批量合成配件)需要消耗较长时间,这种情况下若命令文件内容发生变更,执行器将不得不先执行完当前命令,再载入新的命令。通过 Lua 提供的异常机制,你可以通过“主动抛出错误”来销毁当前的调用栈,并将控制权交还给捕获该异常的调用方,进而达到强制改变执行流的效果。与 Runtime 提供的中断处理功能相结合,可以实现周期性读取命令文件并检查命令是否变更,并根据变更情况立即开始执行新的命令,而不必等到当前命令执行完毕才执行。


    IP属地:江苏2楼2025-03-02 22:37
    回复
      首先,我们希望在命令发生变化时,由更新命令的中断处理函数抛出一个类型为 "COMMAND_CHANGED" 的错误。为处理此错误,需要注册相应的错误处理函数:


      IP属地:江苏3楼2025-03-02 22:38
      回复
        其次,需要通过 Runtime:register_interrupt_handler 注册一个回调函数,用于周期性读取命令,另请参阅“命令的解释与执行”和“运行时”中的内容。当命令类型发生变更时,抛出一个类型为 "COMMAND_CHANGED" 的错误。


        IP属地:江苏4楼2025-03-02 22:39
        回复
          下面是一个最简的解释执行命令的函数:


          IP属地:江苏5楼2025-03-02 22:40
          回复
            然后,通过下面的方式调用 interpret:


            IP属地:江苏6楼2025-03-02 22:40
            回复
              这样,在执行过程中若发生 "COMMAND_CHANGED" 错误,则会销毁从主函数到当前正在执行函数的调用栈,随后立即执行错误处理。错误处理完成后,重新开始解释并执行新的命令。这样,就可以实现命令变更的即时响应。
              需要指出,这样的处理方法还带来了一个额外的好处。例如,在罗技提供的编程框架中,若按下一个按键,并在随后的执行过程中出现了未被处理的错误导致程序终止,该按键并不会被恢复为弹起状态,这往往会导致非常严重的后果。但是,若我们注册了针对这种灾难性错误的处理函数(比如,回弹所有已经按下但尚未弹起的按键),并在主函数体中捕获由入口函数抛出的错误(假定并未注册对这种错误的处理方式,亦或是这种错误无法被 catch 处理),则 catch 会先执行 fatal,回弹所有未弹起的按键,然后再终止程序运行。


              IP属地:江苏7楼2025-03-02 22:41
              回复
                有关 CSOL 集成工具错误处理框架、运行时中断处理框架、命令解释与执行接口等内容,还请参考开发者文档: https://blog.macrohard.fun/CSOL-Utilities/
                开发者文档阅读体验更佳,内容更新较快,贴吧内转载内容仅作交流之用。


                IP属地:江苏8楼2025-03-02 22:43
                回复