getConfig($key) ?? $default; } } function renderExceptionPage($e, $debug = true, $templateFile = ''): string { // Determine template path $templateFile = !empty($templateFile) ? $templateFile : __DIR__ . '/views/errors/exception.html'; // Prepare template variables $data = [ 'code' => $e->getCode(), 'message' => $debug ? $e->getMessage() : 'The current server is experiencing an error, please contact the administrator or try again later.', 'error' => $e->getMessage(), ]; // Add more information in debug mode if ($debug) { $data['trace'] = []; $data['file'] = $e->getFile(); $data['line'] = $e->getLine(); $traceFiles = $e->getTrace(); array_unshift($traceFiles, ['file' => $data['file'], 'line' => $data['line']]); foreach ($traceFiles as $v) { try { if (isset($v['file']) && isset($v['line'])) { $startline = max(1, $v['line'] - 10); $contents = file($v['file']); $data['trace'][] = [ 'file' => $v['file'], 'line' => $v['line'], 'source0' => $contents ? array_slice($contents, 0, 1) : '', 'source' => [ 'startline' => $startline, 'content' => array_slice($contents, $startline - 1, 16) ] ]; } } catch (\Throwable $e) { continue; } } } // Render error page if (!file_exists($templateFile)) { $msg = '
' . htmlspecialchars($data['message']) . '