Fixed Console fails to render Errors, expects Exceptions (php7.3)

Affected version


Well-known member
TypeError: Argument 1 passed to Symfony\Component\Console\Application::renderException() must be an instance of Exception, instance of Error given, called in /var/www/sites/html/src/XF/Cli/Command/AddOnSubAction.php on line 130
Generated by: Unknown account
May 9, 2019 at 2:15 AM

Stack trace
#0 src/XF/Cli/Command/AddOnSubAction.php(130): Symfony\Component\Console\Application->renderException(Object(Error), Object(Symfony\Component\Console\Output\ConsoleOutput))
#1 src/vendor/symfony/console/Command/Command.php(255): XF\Cli\Command\AddOnSubAction->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#2 src/vendor/symfony/console/Application.php(960): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 src/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application->doRunCommand(Object(XF\Cli\Command\AddOnSubAction), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 src/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 src/XF/Cli/Runner.php(63): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 cmd.php(16): XF\Cli\Runner->run()
#7 {main}

Happens when trying to call an invalid static method in an upgrade step. The correct exception/error did log to the xf_error_log


XenForo developer
Staff member
Can you provide a code snippet to reproduce? I'm testing with PHP 7.3.7 and not seeing an error so far. I presume the error is coming from the catch with \Throwable $e in it?


Well-known member
The XF\Cli\Command\AddOnSubAction::execute trait has this catch block;

catch (\Throwable $e)
   // taking this approach so that we don't get double logging
   \XF::logException($e, true, '', true);

   $this->getApplication()->renderException($e, $output);

   return 222;

But the generic CLI runner has this; XF\Cli\Runner::run()

catch (\Throwable $e)
   \XF::logException($e, true); // exiting so rollback
      new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine(), $e),
   $this->outputAdditionalInfo($e, $output);
   $exitCode = 1;

It looks like symfony has some goop around renderException for the exception handler it calls, but the AddOnSubAction stuff directly calls renderException with a Throwable but it takes an Exception

XF Bug Bot

XenForo bug fixer bot
Staff member
Thank you for reporting this issue. It has now been resolved and we are aiming to include it in a future XF release (2.1.5).

Change log:
Wrap Throwable in ErrorException for compatibility with Symfony component
Any changes made as a result of this issue being resolved may not be rolled out here until later.