Lua: pcall () не работает с сопрограммой, как ожидалось - PullRequest
0 голосов
/ 12 июня 2018
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 голосов
/ 12 июня 2018

Две проблемы: (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) для меня.

0 голосов
/ 12 июня 2018

pcall ничего не делает, потому что ошибка не возникает: ошибка в исполняемом файле не вызывает ошибку в вызывающей программе os.execute.Вам нужно проверить код возврата os.execute и вызвать ошибку, если хотите.

...