logException($e); // Show error page $this->renderException($e); } /** * Log exception */ private function logException(\Throwable $e): void { $logFile = storage_path('logs/error.log'); $timestamp = date('Y-m-d H:i:s'); $message = "[{$timestamp}] " . get_class($e) . ": {$e->getMessage()}\n"; $message .= "File: {$e->getFile()}:{$e->getLine()}\n"; $message .= "Stack trace:\n{$e->getTraceAsString()}\n\n"; file_put_contents($logFile, $message, FILE_APPEND | LOCK_EX); } /** * Render exception */ private function renderException(\Throwable $e): void { try { $errorController = new ErrorController(); // Determine error type and render appropriate page if ($e instanceof \App\Core\Exceptions\NotFoundException) { $errorController->notFound(); } elseif ($e instanceof \App\Core\Exceptions\ForbiddenException) { $errorController->forbidden(); } elseif ($e instanceof \App\Core\Exceptions\UnauthorizedException) { $errorController->unauthorized(); } elseif ($e instanceof \App\Core\Exceptions\CsrfMismatchException) { $errorController->csrfMismatch(); } else { $errorController->serverError($e); } } catch (\Throwable $renderException) { // Fallback to basic error page if error rendering fails $this->renderFallbackException($e); } } /** * Render fallback exception (when error page rendering fails) */ private function renderFallbackException(\Throwable $e): void { http_response_code(500); if (is_development()) { $this->renderDevelopmentException($e); } else { $this->renderProductionException(); } } /** * Render development exception */ private function renderDevelopmentException(\Throwable $e): void { http_response_code(500); echo "\n"; echo "\n
\n"; echo "" . htmlspecialchars($e->getMessage()) . "
\n"; echo "File: " . htmlspecialchars($e->getFile()) . ":" . $e->getLine() . "
\n"; echo "" . htmlspecialchars($e->getTraceAsString()) . "\n"; echo "
Something went wrong on our end.
\n"; echo "