5 votes

PHP - Envelopper un bloc de variables dans le même try-catch

Dans mon projet PHP, j'utilise Guzzle pour effectuer un grand nombre de requêtes API différentes. Afin de gérer toutes les exceptions, chaque appel d'API est enveloppé dans un bloc try-catch. Un exemple :

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

Pour chaque demande, le traitement de l'exception est le même mais le bloc d'exécution réel diffère beaucoup et ne peut pas être simplement décrit par un tableau d'options.

Existe-t-il un moyen de créer une fonction/classe capable d'envelopper un bloc d'exécution personnalisé dans le même traitement try-catch ?

Les seules options que j'ai trouvées sont d'utiliser une interface avec une fonction execution() qui est étendu par chaque enfant et une fonction run() qui contient les blocs try-catch et appelle simplement $this->execution() à l'intérieur du bloc d'exécution. Cela fonctionnerait, mais je trouve trop verbeuse la création d'une toute nouvelle classe pour chaque appel d'API différent qui n'est utilisé qu'à un seul endroit de mon projet.

Existe-t-il une solution meilleure/moins verbeuse pour éviter la répétition du code de la même gestion des exceptions ?

6voto

deceze Points 200115

Passer un callable, qui peut être une fonction anonyme, une fonction régulière ou une méthode de classe :

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(...);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X