3.3 KiB
3.3 KiB
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