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