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中显示错误会更方便.