我正在尝试做一个调试器函数,它向我显示错误发生的确切行,发生错误的函数名称以及定义函数的行。考虑以下代码:
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
使用错误处理方法时,如何提取正确的调试信息作为函数名称,定义的行和错误的行?