2016-06-07 127 views
2

我在我的beanstalkd作业类中抛出异常时出现了一个奇怪的问题。当我在作业类之外抛出一个简单的异常(throw new \Exception();)时,它会调用App \ Exceptions \ Handler中的report()方法,我可以在那里做我的调整。但是,当我在作业类中抛出异常时,它不调用report()方法。所有的队列实现都基于laravel文档(https://laravel.com/docs/5.1/queues),并且效果很好。这可能是什么原因?任何帮助将不胜感激。队列工的Laravel异常处理程序

回答

3

那么,它必须是不同的队列。如果作业失败(引发异常),则不希望将控制权交给异常处理程序 - 您希望捕获该错误并将作业标记为失败。

往里Worker.php(线294+):

protected function raiseExceptionOccurredJobEvent($connection, Job $job, $exception) 
{ 
    if ($this->events) { 
     $data = json_decode($job->getRawBody(), true); 

     $this->events->fire(new Events\JobExceptionOccurred($connection, $job, $data, $exception)); 
    } 
} 

参见process()在线路201-223以及。

Laravel将捕获异常,但会触发事件以通知您存在问题。如果你需要进入它 - 只是听这个事件。

+1

谢谢@Denis Mysenko。我同意。听这个事件似乎是一个更好的主意,它使代码干净利落。 –

+0

我在Laravel 5.1中有另一个Worker.php。你使用什么版本? –

+0

在laravel 5.3中我找到了这个函数。谢谢。 –

0

随着laravel 5.1当我使用QUEUE_DRIVER=sync时,我改变它为QUEUE_DRIVER=redis和异常处理程序开始做它的工作,我的意思是打电话report()方法。

以确保您使用运行开始artisan queue:work redis与​​