1

我正在尝试做一个调试器函数,它向我显示错误发生的确切行、发生错误的函数名称以及定义函数的行。考虑以下代码:

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

4

0 回答 0