Я пытаюсь сделать функцию отладчика, которая показывает мне точную строку, в которой произошла ошибка, имя функции, в которой она произошла, и строку, где определена функция. Рассмотрим следующий код:
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
?