首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在laravel控制台命令中显示异常跟踪?

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

Stack Overflow用户
提问于 2015-06-15 02:02:08
回答 3查看 16.4K关注 0票数 27

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

php artisan some:unknowncommand的输出为:

代码语言:javascript
运行
复制
[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.

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

代码语言:javascript
运行
复制
[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,具有以下句柄函数:

代码语言:javascript
运行
复制
/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    generate error here
}

php artisan dp:test的输出为:

代码语言:javascript
运行
复制
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    

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

日志文件确实显示了异常跟踪,因此以某种方式应该可以在cli中显示它。我甚至看不到出现错误的文件名和行枚举器...我该怎么处理这件事?

提前感谢!

编辑:

被深入挖掘了一点。如果我在我的命令中使用了这个:

代码语言:javascript
运行
复制
public function handle()
{
    throw new \Exception("test exception");
}

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-16 19:20:14

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

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

代码语言:javascript
运行
复制
protected function renderForConsole($e)
{
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}

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

我可能会在github上提出这个问题,因为我认为如果用户设置为-v,在命令行界面中显示错误会方便得多。

票数 24
EN

Stack Overflow用户

发布于 2016-08-30 07:24:30

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

代码语言:javascript
运行
复制
use Symfony\Component\Console\Output\OutputInterface;

然后将此代码添加到handle函数的顶部:

代码语言:javascript
运行
复制
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-15 12:35:51

如果您查看Illuminate\Console\Command类,您将看到将错误字符串写入控制台的函数的定义:

代码语言:javascript
运行
复制
/**
 * Write a string as error output.
 *
 * @param  string  $string
 * @return void
 */
public function error($string)
{
    $this->output->writeln("<error>$string</error>");
}

现在您看到它只写入错误字符串,您可以只使用它一点点来实现您想要的结果。您可以获得函数回调跟踪,并向后输出任意数量的行和文件。只需创建扩展命令的类,覆盖该函数,并使所有命令继承该命令类:

代码语言:javascript
运行
复制
/**
 * Write a string as error output.
 *
 * @param  string  $string
 * @return void
 */
public function error($string)
{
    $this->output->writeln("<error>$string</error>");
    $trace = debug_backtrace();
    foreach ($trace as $t) 
    {
        $this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']);
    }

}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30832731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档