bar = $bar; $this->blueScreen = $blueScreen; $this->defer = $defer; } public function initialize() : void { } public function handleException(\Throwable $exception, bool $firstTime) : void { if (Helpers::isAjax() && $this->defer->isAvailable()) { $this->blueScreen->renderToAjax($exception, $this->defer); } elseif ($firstTime && Helpers::isHtmlMode()) { $this->blueScreen->render($exception); } else { Debugger::fireLog($exception); $this->renderExceptionCli($exception); } } private function renderExceptionCli(\Throwable $exception) : void { try { $logFile = Debugger::log($exception, Debugger::EXCEPTION); } catch (\Throwable $e) { echo "{$exception}\nTracy is unable to log error: {$e->getMessage()}\n"; return; } if ($logFile && !\headers_sent()) { \header("X-Tracy-Error-Log: {$logFile}", \false); } if (Helpers::detectColors()) { echo "\n\n" . $this->blueScreen->highlightPhpCli($exception->getFile(), $exception->getLine()) . "\n"; } echo "{$exception}\n" . ($logFile ? "\n(stored in {$logFile})\n" : ''); if ($logFile && Debugger::$browser) { \exec(Debugger::$browser . ' ' . \escapeshellarg(\strtr($logFile, Debugger::$editorMapping))); } } public function handleError(int $severity, string $message, string $file, int $line, array $context = null) : void { if (\function_exists('ini_set')) { $oldDisplay = \ini_set('display_errors', '1'); } if ((\is_bool(Debugger::$strictMode) ? Debugger::$strictMode : Debugger::$strictMode & $severity) && !isset($_GET['_tracy_skip_error'])) { $e = new ErrorException($message, 0, $severity, $file, $line); @($e->context = $context); // dynamic properties are deprecated since PHP 8.2 @($e->skippable = \true); Debugger::exceptionHandler($e); exit(255); } $message = 'PHP ' . Helpers::errorTypeToString($severity) . ': ' . Helpers::improveError($message, (array) $context); $count =& $this->bar->getPanel('Tracy:errors')->data["{$file}|{$line}|{$message}"]; if (!$count++) { // not repeated error Debugger::fireLog(new ErrorException($message, 0, $severity, $file, $line)); if (!Helpers::isHtmlMode() && !Helpers::isAjax()) { echo "\n{$message} in {$file} on line {$line}\n"; } } if (\function_exists('ini_set')) { \ini_set('display_errors', $oldDisplay); } } public function sendAssets() : bool { return $this->defer->sendAssets(); } public function renderLoader() : void { $this->bar->renderLoader($this->defer); } public function renderBar() : void { if (\function_exists('ini_set')) { \ini_set('display_errors', '1'); } $this->bar->render($this->defer); } }