diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2021-01-07 22:04:04 +0300 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2021-01-07 22:11:25 +0300 |
commit | f1921364d692a521c5bf5860ce453bae3f9facae (patch) | |
tree | 7e52141f0a4d909e95468c3a41b16589561912a6 /core/Command | |
parent | 5020c73d15cc58cacfe8bebf87dba2652c7ea5c1 (diff) |
Print an exception trace for setup exceptions
Right now any setup error will just result in the exception message
being printed. In some cases this doesn't give any insights into what
went wrong. This adds some dedicated logic to print the exception trace
and any previous exceptions to the CLI.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/Command')
-rw-r--r-- | core/Command/Maintenance/Install.php | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php index dffbbd03382..ed1aeeff922 100644 --- a/core/Command/Maintenance/Install.php +++ b/core/Command/Maintenance/Install.php @@ -43,6 +43,8 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; +use Throwable; +use function get_class; class Install extends Command { @@ -201,11 +203,25 @@ class Install extends Command { protected function printErrors(OutputInterface $output, $errors) { foreach ($errors as $error) { if (is_array($error)) { - $output->writeln('<error>' . (string)$error['error'] . '</error>'); - $output->writeln('<info> -> ' . (string)$error['hint'] . '</info>'); + $output->writeln('<error>' . $error['error'] . '</error>'); + if (isset($error['hint']) && !empty($error['hint'])) { + $output->writeln('<info> -> ' . $error['hint'] . '</info>'); + } + if (isset($error['exception']) && $error['exception'] instanceof Throwable) { + $this->printThrowable($output, $error['exception']); + } } else { - $output->writeln('<error>' . (string)$error . '</error>'); + $output->writeln('<error>' . $error . '</error>'); } } } + + private function printThrowable(OutputInterface $output, Throwable $t): void { + $output->write('<info>Trace: ' . $t->getTraceAsString() . '</info>'); + if ($t->getPrevious() !== null) { + $output->writeln(''); + $output->writeln('<info>Previous: ' . get_class($t->getPrevious()) . ': ' . $t->getPrevious()->getMessage() . '</info>'); + $this->printThrowable($output, $t->getPrevious()); + } + } } |