コード例 #1
0
 /**
  * Processes a generic exception into an HTTP 500 response.
  *
  * @param \Symfony\Component\Debug\Exception\FlattenException $exception
  *   Metadata about the exception that was thrown.
  * @param \Symfony\Component\HttpFoundation\Request $request
  *   The request object that triggered this exception.
  *
  * @return \Symfony\Component\HttpFoundation\Response
  *   A response object.
  */
 public function on500Html(FlattenException $exception, Request $request)
 {
     $error = $this->decodeException($exception);
     // Because the kernel doesn't run until full bootstrap, we know that
     // most subsystems are already initialized.
     $headers = array();
     // When running inside the testing framework, we relay the errors
     // to the tested site by the way of HTTP headers.
     if (DRUPAL_TEST_IN_CHILD_SITE && !headers_sent() && (!defined('SIMPLETEST_COLLECT_ERRORS') || SIMPLETEST_COLLECT_ERRORS)) {
         // $number does not use drupal_static as it should not be reset
         // as it uniquely identifies each PHP error.
         static $number = 0;
         $assertion = array($error['!message'], $error['%type'], array('function' => $error['%function'], 'file' => $error['%file'], 'line' => $error['%line']));
         $headers['X-Drupal-Assertion-' . $number] = rawurlencode(serialize($assertion));
         $number++;
     }
     watchdog('php', '%type: !message in %function (line %line of %file).', $error, $error['severity_level']);
     // Display the message if the current error reporting level allows this type
     // of message to be displayed, and unconditionnaly in update.php.
     if (error_displayable($error)) {
         $class = 'error';
         // If error type is 'User notice' then treat it as debug information
         // instead of an error message.
         // @see debug()
         if ($error['%type'] == 'User notice') {
             $error['%type'] = 'Debug';
             $class = 'status';
         }
         // Attempt to reduce verbosity by removing DRUPAL_ROOT from the file path
         // in the message. This does not happen for (false) security.
         $root_length = strlen(DRUPAL_ROOT);
         if (substr($error['%file'], 0, $root_length) == DRUPAL_ROOT) {
             $error['%file'] = substr($error['%file'], $root_length + 1);
         }
         // Should not translate the string to avoid errors producing more errors.
         $message = String::format('%type: !message in %function (line %line of %file).', $error);
         // Check if verbose error reporting is on.
         $error_level = $this->container->get('config.factory')->get('system.logging')->get('error_level');
         if ($error_level == ERROR_REPORTING_DISPLAY_VERBOSE) {
             $backtrace_exception = $exception;
             while ($backtrace_exception->getPrevious()) {
                 $backtrace_exception = $backtrace_exception->getPrevious();
             }
             $backtrace = $backtrace_exception->getTrace();
             // First trace is the error itself, already contained in the message.
             // While the second trace is the error source and also contained in the
             // message, the message doesn't contain argument values, so we output it
             // once more in the backtrace.
             array_shift($backtrace);
             // Generate a backtrace containing only scalar argument values.
             $message .= '<pre class="backtrace">' . Error::formatFlattenedBacktrace($backtrace) . '</pre>';
         }
         drupal_set_message(SafeMarkup::set($message), $class, TRUE);
     }
     $content = $this->t('The website has encountered an error. Please try again later.');
     $output = DefaultHtmlPageRenderer::renderPage($content, $this->t('Error'));
     $response = new Response($output);
     $response->setStatusCode(500, '500 Service unavailable (with message)');
     return $response;
 }
コード例 #2
0
 /**
  * Handles any exception as a generic error page for HTML.
  *
  * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
  *   The event to process.
  */
 protected function onHtml(GetResponseForExceptionEvent $event)
 {
     $exception = $event->getException();
     $error = Error::decodeException($exception);
     $flatten_exception = FlattenException::create($exception, 500);
     // Display the message if the current error reporting level allows this type
     // of message to be displayed, and unconditionally in update.php.
     if (error_displayable($error)) {
         $class = 'error';
         // If error type is 'User notice' then treat it as debug information
         // instead of an error message.
         // @see debug()
         if ($error['%type'] == 'User notice') {
             $error['%type'] = 'Debug';
             $class = 'status';
         }
         // Attempt to reduce verbosity by removing DRUPAL_ROOT from the file path
         // in the message. This does not happen for (false) security.
         $root_length = strlen(DRUPAL_ROOT);
         if (substr($error['%file'], 0, $root_length) == DRUPAL_ROOT) {
             $error['%file'] = substr($error['%file'], $root_length + 1);
         }
         // Do not translate the string to avoid errors producing more errors.
         unset($error['backtrace']);
         $message = String::format('%type: !message in %function (line %line of %file).', $error);
         // Check if verbose error reporting is on.
         if ($this->getErrorLevel() == ERROR_REPORTING_DISPLAY_VERBOSE) {
             $backtrace_exception = $flatten_exception;
             while ($backtrace_exception->getPrevious()) {
                 $backtrace_exception = $backtrace_exception->getPrevious();
             }
             $backtrace = $backtrace_exception->getTrace();
             // First trace is the error itself, already contained in the message.
             // While the second trace is the error source and also contained in the
             // message, the message doesn't contain argument values, so we output it
             // once more in the backtrace.
             array_shift($backtrace);
             // Generate a backtrace containing only scalar argument values.
             $message .= '<pre class="backtrace">' . Error::formatFlattenedBacktrace($backtrace) . '</pre>';
         }
         drupal_set_message(SafeMarkup::set($message), $class, TRUE);
     }
     $content = $this->t('The website has encountered an error. Please try again later.');
     $output = DefaultHtmlPageRenderer::renderPage($content, $this->t('Error'));
     $response = new Response($output);
     if ($exception instanceof HttpExceptionInterface) {
         $response->setStatusCode($exception->getStatusCode());
     } else {
         $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR, '500 Service unavailable (with message)');
     }
     $event->setResponse($response);
 }