Lua:pcall()没有像预期的那样使用协同程序

时间:2018-06-12 01:10:11

标签: error-handling lua coroutine

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())没有区别。我怎样才能发现错误?

2 个答案:

答案 0 :(得分:2)

两个问题:(1)os.execute在执行命令失败时不会抛出任何错误,它会返回nil并报告错误,因此" resume&#34 ;成功完成,(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)

答案 1 :(得分:1)

pcall不执行任何操作,因为不会引发错误:执行文件中的错误不会在os.execute的调用方中引发错误。您需要测试os.execute的返回码并在需要时引发错误。