Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- version 2.0
- - hooks the error function by overriding it, calls native error on completion
- - exposes function to get latest stack trace
- - yields when needed, and only if needed! incase of large function call stacks & large no yield time on invoke
- - better file names (extension-less) and line numbers reported on traceback lines
- - allows pcalls to occur in trace
- - does not generate trace for "Terminated" or level of 0 errors, just calls native error
- - better formatted trace
- --]]
- local nativeError = _G.error
- local latestTrace
- function _G.error(_msg, _level)
- if _msg == "Terminated" or _level == 0 then
- error(_msg, _level)
- end
- _level = type(_level) == "number" and _level + 1 or 2
- local trace = {
- "Error Message:",
- string.format(" %s", _msg),
- "",
- "Stack Trace:"
- }
- local ok, err, last = nil, "", os.clock()
- while true do
- ok, err = pcall(nativeError, _msg, _level)
- print(err)
- if err:find("^bios") or err:find("^shell") then
- break
- end
- local name, line = err:match("(%a+)%.?.-:(%d+).-")
- trace[#trace+1] = string.format(" at %s :%d", name or "?", line or 0)
- _level = _level + 1
- if last + os.clock() > 4 then
- os.queueEvent('d')
- coroutine.yield('d')
- last = os.clock()
- end
- end
- latestTrace = trace
- nativeError(_msg, _level)
- end
- function getLatestStackTrace()
- return latestTrace
- end
- _G.error = nativeError
- --[[
- version 1.0
- - hooks the error function by overriding it, calls native error on completion
- - ignores message-less assertions, terminations and throwback levels of 0
- - shows filename and line number
- - can output to file or the terminal
- --]]
- local nativeError = error
- local error_output_terminal = true
- function error(_msg, _level)
- if not _msg or _msg:lower() == 'assertion failed!' or _msg:lower() == 'terminated' or _lvl == 0 then nativeError(_msg, _lvl) end
- _lvl = (_level + 1) or 2
- local trace = {}
- while true do
- _lvl = _lvl + 1
- ok, err = pcall(nativeError, _msg, _lvl)
- if not (err:find('shell') or err:find('bios') or err:find('pcall')) then
- local e = err:gsub(': '.._msg, '')
- table.insert(trace, e)
- else
- break
- end
- end
- trace[1] = trace[1]..': '.._msg
- pcall(term.setTextColor, colors.red)
- local traceOutput = table.concat(trace, '\n ')
- if error_output_terminal then
- textutils.pagedPrint(traceOutput)
- else
- print(trace[1])
- local h = fs.open('.trace_'..math.floor(os.day())..math.floor(os.time())..os.clock(), 'w')
- h.write(traceOutput)
- end
- pcall(term.setTextColor, colors.white)
- nativeError(nil, 0)
- end
- error = nativeError
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement