Lua: pcall() 不能像预期的那样与协程一起工作
Lua: pcall() doesn't work with coroutine as expected
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() 协程本身,没有区别。我怎样才能捕捉到错误?
pcall
什么都不做,因为没有引发错误:执行文件中的错误不会引发 os.execute
的调用者的错误。您需要测试 os.execute
的 return 代码,并在需要时引发错误。
两个问题:(1)os.execute
执行命令失败时不会抛出任何错误,它returns 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)
。
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() 协程本身,没有区别。我怎样才能捕捉到错误?
pcall
什么都不做,因为没有引发错误:执行文件中的错误不会引发 os.execute
的调用者的错误。您需要测试 os.execute
的 return 代码,并在需要时引发错误。
两个问题:(1)os.execute
执行命令失败时不会抛出任何错误,它returns 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)
。