问题
在测试中发现一个比较严重的问题,就是如果协程中发生代码错误的时候(这个没办法完全避免,尤其是数据解析的时候),协程就会发生错误。但是协程发生错误的时候并不会直接复位,会抛出错误的。如下图所示:
后面就会一直出现coroutine.resume出错,这时候模块还在正常跑(这就特别操蛋)。
假设mqtt task出现问题,那么服务器就无法连接上了,对于部署在外面的设备就必须人工重启才能恢复了。
解决
在patch.lua
中,如图所示:
这里增加了一个coroutine.resume
的修饰器,主要是打印coroutine.resume
出错的错误信息。
在下面有个if _G.COROUTINE_ERROR_RESTART then rtos.restart() end
的判断,就是用来判断协程出错要不要重启机。
将_G.COROUTINE_ERROR_RESTART
改为true
就可以了。
在正常使用中,我们希望程序发生错误的时候能重启,而不是将出错的协程忽略继续运行下去。