РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1381 of 1392 menu

Метод 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"

Смотрите также

  • метод then,
    который регистрирует колбэк для успешного завершения пакета
  • метод finally,
    который выполняется после завершения пакета вне зависимости от результата
  • метод cancel,
    который отменяет выполнение пакетной операции
  • метод progress,
    который возвращает процент выполнения пакета
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить