Php 当作业失败时,如何触发laravel jobs failed()方法?

Php 当作业失败时,如何触发laravel jobs failed()方法?,php,laravel-5.2,Php,Laravel 5.2,目前我正在调用taskReport.php并使用generateReport()方法生成报告。我已经检查了作业是否已使用CLI命令php artsan queue:listen执行。如果调用Artisan::call()时出现任何错误,终端中将显示错误消息。因此,我想在failed()中捕获异常,并将错误记录到日志中。 我在handle()方法中尝试了try catch,但它没有捕获异常 protected $options; public function __construct($optio

目前我正在调用task
Report.php
并使用
generateReport()
方法生成报告。我已经检查了作业是否已使用CLI命令
php artsan queue:listen
执行。如果调用
Artisan::call()
时出现任何错误,终端中将显示错误消息。因此,我想在
failed()
中捕获异常,并将错误记录到日志中。 我在
handle()
方法中尝试了
try catch
,但它没有捕获异常

protected $options;
public function __construct($options)
{
    $this->options = array_merge(
        [
            'task'  => 'Report',
            'do'    => 'generateReport',
            'limit' => '10000'
        ],
        $options
    );

}
public function handle()
{
    Artisan::call('execute', [
        '--task'        => $this->options['task'],
        '--do'          => $this->options['do'],
        '--parameters'  => $this->options,

    ]);

}

public function failed()
{
    //
}

如何触发
failed()
并将错误记录到日志中?

Artisan::call
实际上只是调用
execute
控制台类,因此如果在其中抛出
异常
,它应该会自动结束在
failed
方法中

但是,在
5.2
中,
异常
对象不会传递给失败的方法(这是在
5.3
中添加的)

Laravel 5.2

因此,如果需要将
异常
对象传递给
失败的
方法,则需要在
5.2
中执行类似操作:

public function handle()
{
    try {
      Artisan::call('execute', [
        '--task'        => $this->options['task'],
        '--do'          => $this->options['do'],
        '--parameters'  => $this->options,            
      ]);
    } catch (\Exception $e) {
      $this->failed($e)
    }
}

public function failed(\Exception $e = null)
{
    //handle error
}
Laravel 5.3+

5.3
中,
异常
自动传递给
失败
,因此您的代码如下所示:

public function handle()
{
    Artisan::call('execute', [
      '--task'        => $this->options['task'],
      '--do'          => $this->options['do'],
      '--parameters'  => $this->options,            
    ]);
}

public function failed(\Exception $e = null)
{
    //handle error
}

如果我想在作业队列引发异常时继续该怎么办?因为当它抛出异常时,它会停止处理所有队列工作。我需要手动运行Artisan queue:work命令。这个答案完全错误,
failed()
方法是在作业失败后执行某些操作的方法,例如,编写日志,或向管理员发送包含失败作业信息的邮件,如果
handle()中出现任何异常,则调用此方法
无法直接调用。@OlegShakhov我不确定您是否完全阅读了答案。没有什么可以阻止您直接调用
failed
方法,因为它是一个公共方法。在Laravel 5.2中,在异常未传递到
失败的方法之前。在Laravel 5.3和之后,异常总是传递给
failed
方法,我的回答清楚地解释了这一点。