我正在使用Laravel 5.1创建一个基于控制台的应用程序。在开发过程中,我希望在发生错误时显示异常跟踪。但是,即使我在php artisan中使用-v -vv或-vvv选项,我也无法获得自定义命令的异常跟踪。我在我的.env中设置了APP_DEBUG=true,仍然没有异常跟踪。
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:test的输出是相同的。php artisan -vvv dp:test的输出是相同的。
日志文件确实显示了异常跟踪,因此以某种方式应该可以在cli中显示它。我甚至看不到出现错误的文件名和行枚举器...我该怎么处理这件事?
提前感谢!
编辑:
被深入挖掘了一点。如果我在我的命令中使用了这个:
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中找到。
我稍后将进一步挖掘,除非其他人能比我更快地指出解决方案:-)
发布于 2015-06-16 19:20:14
我找到了-v被忽略的原因:
在Illuminate/Foundation/Bootstrap/HandleExceptions.php中,renderForConsole方法使用默认设置实例化ConsoleOutput对象,而不考虑用户要求的详细设置:
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,在命令行界面中显示错误会方便得多。
发布于 2016-08-30 07:24:30
您可以通过添加以下use语句将详细程度设置为您想要的任何级别:
use Symfony\Component\Console\Output\OutputInterface;然后将此代码添加到handle函数的顶部:
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);有关更多信息,请参阅symfony控制台的文档,此处为http://symfony.com/doc/current/console/verbosity.html。
发布于 2015-06-15 12:35:51
如果您查看Illuminate\Console\Command类,您将看到将错误字符串写入控制台的函数的定义:
/**
* Write a string as error output.
*
* @param string $string
* @return void
*/
public function error($string)
{
$this->output->writeln("<error>$string</error>");
}现在您看到它只写入错误字符串,您可以只使用它一点点来实现您想要的结果。您可以获得函数回调跟踪,并向后输出任意数量的行和文件。只需创建扩展命令的类,覆盖该函数,并使所有命令继承该命令类:
/**
* 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']);
}
}https://stackoverflow.com/questions/30832731
复制相似问题