Module:ErrorHandling: Difference between revisions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode |
||
| (8 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
-- | --[[ | ||
* Name: ErrorHandling | |||
* Author: Mark W. Datysgeld | |||
* Description: Centralized error handling system for templates with error tracking, reporting, and graceful failure recovery | |||
* Notes: Formats errors as data attributes for debug monitor display in browser console; creates error contexts; provides protected function execution; supports emergency fallback displays; completely deprecates mw.log usage | |||
]] | |||
local ErrorHandling = {} | local ErrorHandling = {} | ||
| Line 20: | Line 24: | ||
START_TIME = os.clock() * 1000, -- Store in milliseconds | START_TIME = os.clock() * 1000, -- Store in milliseconds | ||
ERROR_COUNT = 0, | ERROR_COUNT = 0, | ||
STATUS_COUNT = 0, | |||
ERRORS = {}, | ERRORS = {}, | ||
STATUSES = {}, | |||
HAS_CRITICAL_ERROR = false | HAS_CRITICAL_ERROR = false | ||
} | } | ||
| Line 51: | Line 57: | ||
-- Return the error context for chaining | -- Return the error context for chaining | ||
return context | |||
end | |||
-- Add a status message to the context | |||
-- @param context The error context | |||
-- @param source The source of the status message (function name) | |||
-- @param message The status message | |||
-- @param details Optional additional details | |||
-- @return The context (for chaining) | |||
function ErrorHandling.addStatus(context, source, message, details) | |||
-- Increment the status count | |||
context.STATUS_COUNT = (context.STATUS_COUNT or 0) + 1 | |||
-- Add the status to the list | |||
table.insert(context.STATUSES, { | |||
id = context.STATUS_COUNT, | |||
source = source or "unknown", | |||
message = message or "Unknown status", | |||
details = details or "" | |||
}) | |||
-- Return the context for chaining | |||
return context | return context | ||
end | end | ||
| Line 86: | Line 114: | ||
-- Create hidden div with minimal footprint | -- Create hidden div with minimal footprint | ||
return string.format('<div style="display:none"%s></div>', attrStr) | return string.format('<div style="display:none"%s></div>', attrStr) | ||
end | |||
-- Format the status context for debugging output using data attributes | |||
-- @param context The error context | |||
-- @return HTML string with data attributes containing status information | |||
function ErrorHandling.formatStatusOutput(context) | |||
-- If no statuses, return empty string | |||
if not context.STATUSES or #context.STATUSES == 0 then | |||
return "" | |||
end | |||
-- Build minimal data attribute div | |||
local divAttributes = { | |||
['data-template-status'] = "1", | |||
['data-status-count'] = tostring(#context.STATUSES) | |||
} | |||
-- Add individual status attributes with minimal naming | |||
for _, stat in ipairs(context.STATUSES) do | |||
divAttributes['data-status-' .. stat.id .. '-source'] = stat.source | |||
divAttributes['data-status-' .. stat.id .. '-msg'] = stat.message | |||
if stat.details and stat.details ~= "" then | |||
divAttributes['data-status-' .. stat.id .. '-details'] = stat.details | |||
end | |||
end | |||
-- Build attribute string efficiently | |||
local attrStr = "" | |||
for k, v in pairs(divAttributes) do | |||
attrStr = attrStr .. ' ' .. k .. '="' .. v .. '"' | |||
end | |||
-- Create hidden div with minimal footprint | |||
return string.format('<div style="display:none"%s></div>', attrStr) | |||
end | |||
-- Formats and combines both error and status outputs | |||
-- @param context The context object | |||
-- @return A string containing HTML for both errors and statuses | |||
function ErrorHandling.formatCombinedOutput(context) | |||
local errorOutput = ErrorHandling.formatOutput(context) | |||
local statusOutput = ErrorHandling.formatStatusOutput(context) | |||
-- Simply concatenate the two outputs. If one is empty, it won't affect the other. | |||
-- A newline is added to ensure they are on separate lines in the HTML source. | |||
if errorOutput ~= "" and statusOutput ~= "" then | |||
return errorOutput .. "\n" .. statusOutput | |||
elseif errorOutput ~= "" then | |||
return errorOutput | |||
else | |||
return statusOutput | |||
end | |||
end | end | ||
| Line 96: | Line 176: | ||
function ErrorHandling.createEmergencyDisplay(args, errorSource, errorMessage, templateType) | function ErrorHandling.createEmergencyDisplay(args, errorSource, errorMessage, templateType) | ||
-- Extract critical information for minimal display | -- Extract critical information for minimal display | ||
local title = args.name or "Unnamed " .. (templateType or "Item") | local title = args.name or ("Unnamed " .. (templateType or "Item")) | ||
-- Create minimal fallback with error data attributes | -- Create minimal fallback with error data attributes | ||