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

Dir*_*irk 24 php console exception laravel-5

我正在使用Laravel 5.1来创建基于控制台的应用程序.在开发期间,我想在发生错误时显示异常跟踪.但是,即使我使用-v -vv或-vvv选项php artisan,我也不会获得自定义命令的异常跟踪.我设置APP_DEBUG=true了我的.env,仍然没有异常的痕迹.

输出php artisan some:unknowncommand是:

[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.
Run Code Online (Sandbox Code Playgroud)

输出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
...
Run Code Online (Sandbox Code Playgroud)

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

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

输出php artisan dp:test是:

[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    
Run Code Online (Sandbox Code Playgroud)

输出php artisan -v dp:test是一样的.输出php artisan -vvv dp:test是一样的.

日志文件显示异常跟踪,因此应该可以在cli中显示它.我甚至没有看到错误发生的文件名和亚麻布...我该如何处理?

提前致谢!

编辑:

被挖得更远了.如果我在我的命令中使用它:

public function handle()
{
    throw new \Exception("test exception");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dir*_*irk 20

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

Illuminate/Foundation/Bootstrap/HandleExceptions.php,renderForConsoleinode ConsoleOutput使用默认设置实例化一个对象,而不考虑用户要求的详细程度设置:

protected function renderForConsole($e)
{
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}
Run Code Online (Sandbox Code Playgroud)

因此,无论设置了-v -vv还是-vvv,$output->getVerbosity()in vendor/symfony/console/Application.php总是低于OutputInterface::VERBOSITY_VERBOSE,因此不会打印堆栈跟踪.

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

  • 使用Laravel 5.3它似乎工作.对-v一无所知,现在就做.谢谢. (4认同)