В моем 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, который используется только в одной точке моего проекта.
Есть ли лучшее / менее подробное решение, позволяющее избежать повторения кода при обработке одной и той же исключительной ситуации?
Передайте вызываемый, который может быть анонимные функции, обычная функция или метод класса:
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(...);
});
Других решений пока нет …