Хелпер функция rescue()
Иногда мы вынуждены использовать блок try-catch, чтобы просто проигнорировать ожидаемое исключение, которое внешний сервис выбрасывает при сбое. Laravel предлагает более элегантное решение для таких сценариев с помощью функции rescue() 🚀.
<?php
// Если возникнет исключение, значение переменной $language будет равно 'en'.
try {
$language = LanguageDetector::detect($request->ip());
} catch (Exception $e) {
$language = 'en';
}
// Более элегантный способ добиться того же, но исключение все равно будет зарегистрировано.
$language = rescue(fn () => LanguageDetector::detect($request->ip()), 'en');
Функция rescue()
выполняет замыкание (closure) и перехватывает все исключения, возникающие во время его выполнения. Все пойманные исключения будут отправлены в ваш обработчик исключений, однако обработка запроса будет продолжена:
<?php
return rescue(fn () => $this->method());
Вы также можете передать второй аргумент. Этот аргумент будет значением по умолчанию, которое должно быть возвращено, если во время выполнения замыкания возникнет исключение:
<?php
return rescue(fn () => $this->method(), false);
return rescue(
fn () => $this->method(),
fn () => $this->failure()
);
Аргумент report
может быть передан функции rescue()
, чтобы определить, следует ли сообщать об исключении через функцию report
:
return rescue(
fn () => $this->method(),
report: fn (Throwable $throwable) => $throwable instanceof InvalidArgumentException
);