示例#1
0
 /**
  * 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();
 }
示例#2
0
 /**
  * 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();
 }
示例#3
0
 /**
  * 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);
     }
 }
示例#4
0
 /**
  * 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
     }
 }