/** * render. * * @method render * * @param \Exception $exception * * @return string */ public function render(Exception $exception) { $exception = $this->fixStack($exception, error_get_last()); ob_start(); Helpers::improveException($exception); Debugger::getBlueScreen()->render($exception); return ob_get_clean(); }
/** * render. * * @method render * * @param \Exception $exception * * @return string */ public function render(Exception $exception, $error = null) { $error = is_null($error) === true ? error_get_last() : $error; $exception = $this->fixStack($exception, $error); ob_start(); Helpers::improveException($exception); Debugger::getBlueScreen()->render($exception); return ob_get_clean(); }
/** * Handler to catch uncaught exception. * @param \Exception|\Throwable * @return void * @internal */ public static function exceptionHandler($exception, $exit = TRUE) { if (!self::$reserved) { return; } self::$reserved = NULL; if (!headers_sent()) { $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; $code = isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE ') !== FALSE ? 503 : 500; header("{$protocol} {$code}", TRUE, $code); if (self::isHtmlMode()) { header('Content-Type: text/html; charset=UTF-8'); } } Helpers::improveException($exception); if (self::$productionMode) { try { self::log($exception, self::EXCEPTION); } catch (\Throwable $e) { } catch (\Exception $e) { } if (self::isHtmlMode()) { $logged = empty($e); require self::$errorTemplate ?: __DIR__ . '/assets/Debugger/error.500.phtml'; } elseif (PHP_SAPI === 'cli') { fwrite(STDERR, 'ERROR: application encountered an error and can not continue. ' . (isset($e) ? "Unable to log error.\n" : "Error was logged.\n")); } } elseif (!connection_aborted() && self::isHtmlMode()) { self::getBlueScreen()->render($exception); if (self::$showBar) { self::getBar()->render(); } } else { self::fireLog($exception); $s = get_class($exception) . ($exception->getMessage() === '' ? '' : ': ' . $exception->getMessage()) . ' in ' . $exception->getFile() . ':' . $exception->getLine() . "\nStack trace:\n" . $exception->getTraceAsString(); try { $file = self::log($exception, self::EXCEPTION); if ($file && !headers_sent()) { header("X-Tracy-Error-Log: {$file}"); } echo "{$s}\n" . ($file ? "(stored in {$file})\n" : ''); if ($file && self::$browser) { exec(self::$browser . ' ' . escapeshellarg($file)); } } catch (\Throwable $e) { echo "{$s}\nUnable to log error: {$e->getMessage()}\n"; } catch (\Exception $e) { echo "{$s}\nUnable to log error: {$e->getMessage()}\n"; } } try { $e = NULL; foreach (self::$onFatalError as $handler) { call_user_func($handler, $exception); } } catch (\Throwable $e) { } catch (\Exception $e) { } if ($e) { try { self::log($e, self::EXCEPTION); } catch (\Throwable $e) { } catch (\Exception $e) { } } if ($exit) { exit($exception instanceof \Error ? 255 : 254); } }
/** * 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'] instanceof \Throwable) ? $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; Helpers::improveException($e); try { self::log($e, self::ERROR); } catch (\Throwable $e) { } 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 (\Throwable $e) { } catch (\Exception $foo) { } return NULL; } else { self::fireLog(new ErrorException($message, 0, $severity, $file, $line)); return Helpers::isHtmlMode() || Helpers::isAjax() ? NULL : FALSE; // FALSE calls normal error handler } }