Метод catch
Метод catch класса Batch позволяет определить функцию обратного вызова, которая будет вызвана, если хотя бы одно задание в пакете завершится с ошибкой. Этот метод принимает замыкание, в которое передаются два аргумента: экземпляр самого пакета и исключение, вызвавшее ошибку. Обработчик выполняется асинхронно, после того как пакет завершит выполнение или остановится из-за сбоя.
Синтаксис
<?php
$batch->catch(function (Batch $batch, Throwable $e) {
// Логика обработки ошибки
});
?>
Пример
Допустим, у нас есть пакет заданий для отправки уведомлений. Мы хотим записать в лог информацию об ошибке, если какое-либо задание завершится неудачно:
<?php
use AppJobsSendNotification;
use IlluminateSupportFacadesBus;
use IlluminateSupportFacadesLog;
use IlluminateBusBatch;
$batch = Bus::batch([
new SendNotification(1),
new SendNotification(2),
new SendNotification(3),
])->catch(function (Batch $batch, Throwable $e) {
Log::error('Batch job failed: ' . $e->getMessage());
})->dispatch();
?>
Результат выполнения кода (в случае ошибки):
"Batch job failed: Connection timed out"
Пример
В этом примере мы обрабатываем ошибки в пакете и выполняем дополнительное действие, например, отправляем уведомление администратору о сбое:
<?php
use AppJobsProcessFile;
use IlluminateSupportFacadesBus;
use IlluminateSupportFacadesMail;
use AppMailAdminAlert;
use IlluminateBusBatch;
$batch = Bus::batch([
new ProcessFile('file1.csv'),
new ProcessFile('file2.csv'),
])->catch(function (Batch $batch, Throwable $e) {
Mail::to('admin@example.com')->send(
new AdminAlert('Batch failed: ' . $batch->id, $e->getMessage())
);
})->dispatch();
?>
Результат выполнения кода:
"Admin alert sent for batch 5"
Пример
В комбинации с методом then можно организовать полный жизненный цикл пакетной обработки: успех, ошибка и завершение в любом случае:
<?php
use AppJobsSyncData;
use IlluminateSupportFacadesBus;
use IlluminateBusBatch;
$batch = Bus::batch([
new SyncData(1),
new SyncData(2),
])->then(function (Batch $batch) {
// Успешное завершение
echo "Batch completed successfully";
})->catch(function (Batch $batch, Throwable $e) {
// Ошибка
echo "Batch failed: " . $e->getMessage();
})->finally(function (Batch $batch) {
// Всегда выполняется
echo "Batch finished";
})->dispatch();
?>
Результат выполнения кода при ошибке:
"Batch failed: Database connection refused"
"Batch finished"
Результат выполнения кода при успехе:
"Batch completed successfully"
"Batch finished"