【问题标题】:Lua: pcall() doesn't work with coroutine as expectedLua:pcall() 不能按预期与协程一起使用
【发布时间】:2018-06-12 01:10:11
【问题描述】:
local function proc_close(a, b)
    _XNO.processList[a] = nil
    if b then panic("process, "..b) end
end

local function proc_load(a)
    local thread = coroutine.create(function()
        os.execute(a)
    end)
    _XNO.processList[thread] = a
    local status, err = pcall(coroutine.resume, thread)
    if not status then
        proc_close(thread, err)
    end
end

proc_load("/some_file")

当它在执行文件中出错时 pcall() 什么也不做,返回的错误与在主代码中一样。如果我 pcall() 协程中的函数,或者我 pcall() 协程本身没有区别。我怎样才能发现错误?

【问题讨论】:

    标签: error-handling lua coroutine


    【解决方案1】:

    两个问题:(1)os.execute在执行命令失败时不会抛出任何错误,它返回nil并报告错误,所以“恢复”成功完成,(2)你没有需要pcall,因为resume 调用已经完成了捕获错误所需的操作。试试下面的例子:

    local thread = coroutine.create(function()
        foo()
      end)
    print(coroutine.resume(thread))
    

    这将为我打印false pcall-thread.lua:2: attempt to call global 'foo' (a nil value)

    【讨论】:

      【解决方案2】:

      pcall 什么都不做,因为没有引发错误:执行文件中的错误不会在 os.execute 的调用者中引发错误。您需要测试os.execute 的返回码,如果需要,请提出错误。

      【讨论】:

      • 你说得对!我忘记了已经犯了这个错误,现在感觉像个傻瓜。将其替换为 dofile() 有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2017-01-22
      相关资源
      最近更新 更多