You are here

public function Application::renderException in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/symfony/console/Application.php \Symfony\Component\Console\Application::renderException()

Renders a caught exception.

Parameters

\Exception $e An exception instance:

OutputInterface $output An OutputInterface instance:

1 call to Application::renderException()
Application::run in vendor/symfony/console/Application.php
Runs the current application.

File

vendor/symfony/console/Application.php, line 632

Class

Application
An Application is the container for a collection of commands.

Namespace

Symfony\Component\Console

Code

public function renderException($e, $output) {
  do {
    $title = sprintf('  [%s]  ', get_class($e));
    $len = $this
      ->stringWidth($title);
    $width = $this
      ->getTerminalWidth() ? $this
      ->getTerminalWidth() - 1 : PHP_INT_MAX;

    // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
    if (defined('HHVM_VERSION') && $width > 1 << 31) {
      $width = 1 << 31;
    }
    $formatter = $output
      ->getFormatter();
    $lines = array();
    foreach (preg_split('/\\r?\\n/', $e
      ->getMessage()) as $line) {
      foreach ($this
        ->splitStringByWidth($line, $width - 4) as $line) {

        // pre-format lines to get the right string length
        $lineLength = $this
          ->stringWidth(preg_replace('/\\[[^m]*m/', '', $formatter
          ->format($line))) + 4;
        $lines[] = array(
          $line,
          $lineLength,
        );
        $len = max($lineLength, $len);
      }
    }
    $messages = array(
      '',
      '',
    );
    $messages[] = $emptyLine = $formatter
      ->format(sprintf('<error>%s</error>', str_repeat(' ', $len)));
    $messages[] = $formatter
      ->format(sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $this
      ->stringWidth($title)))));
    foreach ($lines as $line) {
      $messages[] = $formatter
        ->format(sprintf('<error>  %s  %s</error>', $line[0], str_repeat(' ', $len - $line[1])));
    }
    $messages[] = $emptyLine;
    $messages[] = '';
    $messages[] = '';
    $output
      ->writeln($messages, OutputInterface::OUTPUT_RAW);
    if (OutputInterface::VERBOSITY_VERBOSE <= $output
      ->getVerbosity()) {
      $output
        ->writeln('<comment>Exception trace:</comment>');

      // exception related properties
      $trace = $e
        ->getTrace();
      array_unshift($trace, array(
        'function' => '',
        'file' => $e
          ->getFile() !== null ? $e
          ->getFile() : 'n/a',
        'line' => $e
          ->getLine() !== null ? $e
          ->getLine() : 'n/a',
        'args' => array(),
      ));
      for ($i = 0, $count = count($trace); $i < $count; ++$i) {
        $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
        $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
        $function = $trace[$i]['function'];
        $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
        $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
        $output
          ->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line));
      }
      $output
        ->writeln('');
      $output
        ->writeln('');
    }
  } while ($e = $e
    ->getPrevious());
  if (null !== $this->runningCommand) {
    $output
      ->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand
      ->getSynopsis(), $this
      ->getName())));
    $output
      ->writeln('');
    $output
      ->writeln('');
  }
}