Почему результат прямого возврата Lua не может быть отлажен должным образом? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь сделать функцию отладчика, которая показывает мне точную строку, в которой произошла ошибка, имя функции, в которой она произошла, и строку, где определена функция. Рассмотрим следующий код:

function StatusLog(vet,vErr)
  local tInfo, sDbg = debug.getinfo(2), ""
  sDbg = sDbg.." "..(tInfo.linedefined and "["..tInfo.linedefined.."]" or "X")
  sDbg = sDbg..(tInfo.name and tInfo.name or "Main")
  sDbg = sDbg..(tInfo.currentline and ("["..tInfo.currentline.."]") or "X")
  sDbg = sDbg.."@"..(tInfo.source and (tInfo.source:gsub("^%W", "")) or "N")
  print("Debug: "..sDbg)
  return vRet
end

local function add(a,b)
  if(not a) then return StatusLog(nil, "Missing argument A") end
  if(not b) then
    StatusLog(nil, "Missing argument B")
    return nil
  end
  return (a + b)
end

print(add(1,   1)) --- Prints: "2" Normal  OK
print(add(1, nil)) --- Errors: [11]add[14] OK
print(add(nil, 1)) --- Errors: [0]Main[21] KO

Вы можете четко видеть, когда один из двух аргументов равен nil, функция add(a,b) выдаст ошибку, однако, если аргумент B отсутствует, информация об отладке в порядке, а когда аргумент A отсутствует Отладочная информация не работает. Он должен показывать ту же отладочную информацию, что и B, но это не так. Возможно, это связано с оператором return StatusLog, который разбивает стек.

Как извлечь правильную отладочную информацию в виде имени функции, определенной строки и строки ошибки, когда я использую метод обработки ошибок для аргумента A?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...