108 lines
3.3 KiB
Markdown
108 lines
3.3 KiB
Markdown
local LOGGER = require("log")
|
|
|
|
local errorHandler = {
|
|
tracebackEnabled = true,
|
|
header = "Basalt Error"
|
|
}
|
|
|
|
local function coloredPrint(message, color)
|
|
term.setTextColor(color)
|
|
print(message)
|
|
term.setTextColor(colors.white)
|
|
end
|
|
|
|
function errorHandler.error(errMsg)
|
|
if errorHandler.errorHandled then
|
|
error()
|
|
end
|
|
term.setBackgroundColor(colors.black)
|
|
|
|
term.clear()
|
|
term.setCursorPos(1, 1)
|
|
|
|
coloredPrint(errorHandler.header..":", colors.red)
|
|
print()
|
|
|
|
local level = 2
|
|
local topInfo
|
|
while true do
|
|
local info = debug.getinfo(level, "Sl")
|
|
if not info then break end
|
|
topInfo = info
|
|
level = level + 1
|
|
end
|
|
local info = topInfo or debug.getinfo(2, "Sl")
|
|
local fileName = info.source:sub(2)
|
|
local lineNumber = info.currentline
|
|
local errorMessage = errMsg
|
|
|
|
if(errorHandler.tracebackEnabled)then
|
|
local stackTrace = debug.traceback()
|
|
if stackTrace then
|
|
--coloredPrint("Stack traceback:", colors.gray)
|
|
for line in stackTrace:gmatch("[^\r\n]+") do
|
|
local fileNameInTraceback, lineNumberInTraceback = line:match("([^:]+):(%d+):")
|
|
if fileNameInTraceback and lineNumberInTraceback then
|
|
term.setTextColor(colors.lightGray)
|
|
term.write(fileNameInTraceback)
|
|
term.setTextColor(colors.gray)
|
|
term.write(":")
|
|
term.setTextColor(colors.lightBlue)
|
|
term.write(lineNumberInTraceback)
|
|
term.setTextColor(colors.gray)
|
|
line = line:gsub(fileNameInTraceback .. ":" .. lineNumberInTraceback, "")
|
|
end
|
|
coloredPrint(line, colors.gray)
|
|
end
|
|
print()
|
|
end
|
|
end
|
|
|
|
if fileName and lineNumber then
|
|
term.setTextColor(colors.red)
|
|
term.write("Error in ")
|
|
term.setTextColor(colors.white)
|
|
term.write(fileName)
|
|
term.setTextColor(colors.red)
|
|
term.write(":")
|
|
term.setTextColor(colors.lightBlue)
|
|
term.write(lineNumber)
|
|
term.setTextColor(colors.red)
|
|
term.write(": ")
|
|
|
|
|
|
if errorMessage then
|
|
errorMessage = string.gsub(errorMessage, "stack traceback:.*", "")
|
|
if errorMessage ~= "" then
|
|
coloredPrint(errorMessage, colors.red)
|
|
else
|
|
coloredPrint("Error message not available", colors.gray)
|
|
end
|
|
else
|
|
coloredPrint("Error message not available", colors.gray)
|
|
end
|
|
|
|
local file = fs.open(fileName, "r")
|
|
if file then
|
|
local lineContent = ""
|
|
local currentLineNumber = 1
|
|
repeat
|
|
lineContent = file.readLine()
|
|
if currentLineNumber == tonumber(lineNumber) then
|
|
coloredPrint("\149Line " .. lineNumber, colors.cyan)
|
|
coloredPrint(lineContent, colors.lightGray)
|
|
break
|
|
end
|
|
currentLineNumber = currentLineNumber + 1
|
|
until not lineContent
|
|
file.close()
|
|
end
|
|
end
|
|
|
|
term.setBackgroundColor(colors.black)
|
|
LOGGER.error(errMsg)
|
|
errorHandler.errorHandled = true
|
|
error()
|
|
end
|
|
|
|
return errorHandler |