2017-08-09 120 views
1

目前我正在调用任务Report.php并使用generateReport()方法生成报告。我检查了使用CLI命令php artsan queue:listen执行了这些作业。如果在拨打Artisan::call()时出现任何问题,错误信息将显示在终端中。所以我想赶上failed()的异常,我想将错误记录到日志中。 我已经尝试try catchhandle()方法,但它没有捕捉到例外。如何在作业失败时触发laravel作业失败()方法?

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()并将错误记录到日志中?

回答

0

Artisan::call实际上只是调用execute控制台类,所以,如果你在那里引发Exception应该在failed方法自动结束。

但是,在5.2中,Exception对象未传递到失败的方法(这是在5.3中添加的)。

Laravel 5.2

所以如果你需要传递给failed方法Exception对象,那么你需要做这样的事情在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.3Exception自动传递给failed所以你的代码应该是这样的:

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 
}