/** * @author David Grudl * @see https://github.com/nette/tracy */ protected static function formatMessage(Throwable $message) : string { $tmp = []; while ($message) { $tmp[] = ($message instanceof \ErrorException ? Helpers::errorTypeToString($message->getSeverity()) . ': ' . $message->getMessage() : Helpers::getClass($message) . ': ' . $message->getMessage()) . ' in ' . $message->getFile() . ':' . $message->getLine(); $message = $message->getPrevious(); } $message = implode($tmp, "\ncaused by "); return trim($message); }
/** * Renders blue screen. * @param \Exception * @return void */ public function render(\Exception $exception) { $panels = $this->panels; $info = array_filter($this->info); $source = Helpers::getSource(); $sourceIsUrl = preg_match('#^https?://#', $source); $title = $exception instanceof \ErrorException ? Helpers::errorTypeToString($exception->getSeverity()) : get_class($exception); $skipError = $sourceIsUrl && $exception instanceof \ErrorException && !empty($exception->skippable) ? $source . (strpos($source, '?') ? '&' : '?') . '_tracy_skip_error' : NULL; require __DIR__ . '/templates/bluescreen.phtml'; }
/** * Handler to catch warnings and notices. * @return bool FALSE to call normal error handler, NULL otherwise * @throws ErrorException * @internal */ public static function errorHandler($severity, $message, $file, $line, $context) { if (self::$scream) { error_reporting(E_ALL); } if ($severity === E_RECOVERABLE_ERROR || $severity === E_USER_ERROR) { if (Helpers::findTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), '*::__toString')) { $previous = isset($context['e']) && $context['e'] instanceof \Exception ? $context['e'] : NULL; $e = new ErrorException($message, 0, $severity, $file, $line, $previous); $e->context = $context; self::exceptionHandler($e); } $e = new ErrorException($message, 0, $severity, $file, $line); $e->context = $context; throw $e; } elseif (($severity & error_reporting()) !== $severity) { return FALSE; // calls normal error handler to fill-in error_get_last() } elseif (self::$productionMode && ($severity & self::$logSeverity) === $severity) { $e = new ErrorException($message, 0, $severity, $file, $line); $e->context = $context; try { self::log($e, self::ERROR); } catch (\Exception $foo) { } return NULL; } elseif (!self::$productionMode && !isset($_GET['_tracy_skip_error']) && (is_bool(self::$strictMode) ? self::$strictMode : (self::$strictMode & $severity) === $severity)) { $e = new ErrorException($message, 0, $severity, $file, $line); $e->context = $context; $e->skippable = TRUE; self::exceptionHandler($e); } $message = 'PHP ' . Helpers::errorTypeToString($severity) . ": {$message}"; $count =& self::getBar()->getPanel('Tracy:errors')->data["{$file}|{$line}|{$message}"]; if ($count++) { // repeated error return NULL; } elseif (self::$productionMode) { try { self::log("{$message} in {$file}:{$line}", self::ERROR); } catch (\Exception $foo) { } return NULL; } else { self::fireLog(new ErrorException($message, 0, $severity, $file, $line)); return self::isHtmlMode() ? NULL : FALSE; // FALSE calls normal error handler } }