如何在 laravel 控制台命令中显示异常跟踪?

2022-08-30 14:56:57

我正在使用Laravel 5.1创建一个基于控制台的应用程序。在开发过程中,我希望在发生错误时显示异常跟踪。但是,即使我在 中使用 -v -vv 或 -vvv 选项,我也不会获得自定义命令的异常跟踪。我设置了我的,仍然没有异常跟踪。php artisanAPP_DEBUG=true.env

的输出为:php artisan some:unknowncommand

[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.

的输出为:php artisan -v some:unknowncommand

[InvalidArgumentException]                              
  There are no commands defined in the "some" namespace.  

Exception trace:
 () at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
 Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
 Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
 Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...

现在,我创建了一个非常简单的控制台命令,名为dp:test,具有以下句柄函数:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    generate error here
}

的输出为:php artisan dp:test

[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    

的输出是相同的。的输出是相同的。php artisan -v dp:testphp artisan -vvv dp:test

日志文件确实显示异常跟踪,因此应该以某种方式在 cli 中显示它。我甚至没有看到发生错误的文件名和 linenumer...我该如何处理这个问题?

提前致谢!

编辑:

被挖得更远一点。如果我在我的命令中使用它:

public function handle()
{
    throw new \Exception("test exception");
}

我发出命令,错误跟踪被打印出来。仅当由于 PHP 错误引发异常时,才会不打印跟踪。在方法中,PHP 错误将转换为异常。发生这种情况时,将引发异常,但在打印时会以某种方式忽略 -v。这是非常不方便的,因为它使调试CLI应用程序变得困难。php artisan -v dp:testIlluminate/Foundation/Bootstrap/HandleExceptions.phpbootstrap

我认为解决方案可以在,方法中找到。vendor/symfony/console/Application.phprenderException

我稍后会进一步挖掘,除非其他人可以比我更快地指出解决方案:-)


答案 1

我找到了为什么-v被忽略的原因:

中,该方法使用默认设置实例化对象,而不考虑用户要求的详细程度设置:Illuminate/Foundation/Bootstrap/HandleExceptions.phprenderForConsoleConsoleOutput

protected function renderForConsole($e)
{
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}

因此,无论设置了 -v -vv 或 -vvv,in 始终低于 ,因此,不会打印堆栈跟踪。$output->getVerbosity()vendor/symfony/console/Application.phpOutputInterface::VERBOSITY_VERBOSE

我可能会为此在github上发起一个问题,因为我认为如果用户设置-v,如果在CLI中显示错误会更方便。


答案 2

您可以通过添加以下 use 语句将详细程度设置为所需的任何级别:

use Symfony\Component\Console\Output\OutputInterface;

然后将其添加到句柄函数的顶部:

$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);

有关详细信息,请参阅此处的 symfony 控制台文档 http://symfony.com/doc/current/console/verbosity.html。


推荐