PHP - Обернуть блок переменной в том же try-catch - PullRequest
0 голосов
/ 14 декабря 2018

В моем PHP-проекте я использую Guzzle для выполнения множества различных API-запросов.Для обработки всех исключений каждый вызов API заключен в блок try-catch.Пример:

        try {
            $res = $client->get($url, [
                'headers' => [
                    'Authorization' => "bearer " . $jwt,
                ]
            ]);
        } catch (ClientException $clientException) {
            // Do stuff
        } catch (ConnectException $connectException) {
            // Do stuff
        }catch (RequestException $requestException){
            // Do stuff
        }

Для каждого запроса обработка исключений одинакова, но фактический блок выполнения сильно отличается и не может быть просто описан массивом опций.

Есть лиспособ создать функцию / класс, способный обернуть пользовательский блок выполнения в ту же обработку try-catch?

Единственные варианты, которые я придумал, - это использовать интерфейс с расширенной функцией execution()каждым дочерним элементом и функцией run(), которая имеет блоки try-catch и просто вызывает $this->execution() внутри блока исполнения.Это бы сработало, но я нашел слишком многословным создание целого нового класса для каждого отдельного вызова API, который используется только в одной точке моего проекта.

Есть ли лучшее / менее подробное решение, чтобы избежать повторения кодатой же обработки исключений?

1 Ответ

0 голосов
/ 14 декабря 2018

Передайте вызываемый объект, который может быть анонимной функцией, обычной функцией или методом класса :

function executeGuzzle(callable $fun) {
    try {
        return $fun();
    } catch (ClientException $clientException) {
        // Do stuff
    } catch (ConnectException $connectException) {
        // Do stuff
    } catch (RequestException $requestException) {
        // Do stuff
    }
}

$res = executeGuzzle(function () use ($client) {
    return $client->get(...);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...