Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

De la bonne gestion des try{}catch{}

Article posté le 13-09-2016 dans la catégorie Développement

Dans la lignée de cet article sur les différents types de valeur retournées en PHP, il est intéressant de rappeler que les boucles try et catch doivent être utilisées, et ce dans tous les langages, de manière intelligente.

En effet, il est courant de voir qu'une méthode A qui peut potentiellement lever une exception, englobe son traitement dans une boucle try{} catch{} , et que la méthode B, qui appelle cette méthode A, englobe elle aussi ce traitement. 

Soyons direct: cela est inutile. Comme le disent les anglophones, les erreurs "bubblent" - remontent - automatiquement vers la couche appelante. Donc quand vos méthodes doivent jeter des exceptions, laissez le code appelant la traiter, mettre des try - catch partout ne servira à rien. De plus, la plupart des IDE vous préviendront que la code que vous appelez peut potentiellement lever une erreur, donc inutile de "tartiner" votre code.

Par contre, afin de bien faire les choses, n'hésitez pas à jeter des exceptions manuellement. Exemple:

Dans un repository d'une entité "Livre", vous allez créer une méthode getByCategory($intCateg);. Vous l'avez deviné, elle doit vous retourner une collection d'entités de type "Livre". Il est encore trop courant de voir des types de retour "mixed": en clair, si votre méthode trouve des résultats, elle retournera la collection, sinon elle retournera false. Ce n'est pas une bonne approche. Reprenons le cas de PHP, qui est entré dans la "modernité" depuis plus de dix ans maintenant: vous devez jeter manuellement une exception si vous ne trouvez pas de résultat.

public function getByCategory($inCateg) {
    $arrResults = ... // Execution de votre requête
    if(is_null(arrResults)) {
        // Ici jetez une exception spéciale , par exemple dans Doctrine, une "No results Exception".
    }
    return $arrResults ;
}

Comme il ne s'agit pas de la seule exception qui puisse être levée, voici donc le code appelant:

try {
    $mesLivres = $monRepo->getByCategory($intCateg);
} catch (NoResultsException $ex) {
    //...
} catch (Exception $e) {
    //...
}

 


Tweet
comments powered by Disqus