Lua:使用 coroutine 时 pcall() 的预期效果不起作用

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() 无法起到任何作用,错误将返回为主要代码中的错误。无论是在协程中调用函数还是调用协程本身,都没有区别。如何捕获错误?

点赞
用户107090
用户107090

pcall 并不做任何事情,因为没有错误被触发:在执行的文件中的错误不会在 os.execute 调用者中引发错误。如果需要,需要测试返回码并引发错误。

2018-06-12 02:43:27
用户1442917
用户1442917

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

2018-06-12 02:46:09