Class et retour de messages d'erreurs

Eléphant du PHP | 64 Messages

06 oct. 2017, 17:00

Bonjour,

Petite question concernant la gestion des retours d'erreur à partir des fonctions présentent dans des class.
En cas de retour pour le moment je fais un "return false;", et dans mon code je vérifie sur mon appel retourne false (auquel cas j'affiche un message d'erreur), ou pas, et le traitement continue.

Le souci avec cette méthode c'est que je n'ai pas de message d'erreur personnalisé en fonction de ce qui s'est passé.

Exemple concret: je veux vérifier qu'une personne que j'enregistre n'est pas déjà présente dans la base, et ensuite qu'elle a, par exemple, plus de 18 ans. En 2 "if" donc.
Avec ma méthode, je retournerai "false" dans les 2 cas, et donc, difficile d'aiguiller l'utilisateur sur l'erreur.

La plupart du temps les retours corrects sont des tableaux de données, et je pourrais donc vérifier avec un "is_array", mais je ne sais pas si c'est "propre" comme solution ou pas...

Bref, qu'elle pourrait être une bonne façon de faire?

Merci!

ViPHP
ViPHP | 2286 Messages

16 oct. 2017, 23:45

Salut :-)

PHP offre deux options intéressantes pour des erreurs personnalisées : il y a la fonction http://php.net/trigger_error (je te laisse aller voir la page de manuel et te ballader dans les liens associés, tous intéressants) qui permet de lancer une erreur php quasiment "classique", à ceci près que le niveau de sévérité ainsi que le message sont personnalisables. Mais il y a encore mieux.

Le must en matière de gestion d'erreur en POO, ce sont les exceptions.

Les exceptions sont des classes qui héritent toutes de la classe de base Exception, éxécutées avec le mot-clé spécial throw et (le plus sympa) peuvent être attrappées avec le mot-clé catch. Là aussi on peut personnaliser (c'est même le but), non seulement le message (qui est le paramètre transmis lors de l'instanciation de l'exception) mais aussi la classe de l'exception elle-même (on peut déclarer ses propres sous-classes qui héritent d'Exception ou une de ses classes-filles prédéfinies, ça marche fort bien et c'est propre). Une exception non attrapée par un bloc try/catch a un comportement proche d'une erreur php. La page de manuel explique assez bien de quoi il retourne : http://php.net/manual/fr/language.exceptions.php
if([email protected]work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 64 Messages

22 oct. 2017, 19:44

Salut,

Ok, tout bêtement.
Bon ben c'est en cours d'utilisation. ;)

Merci!

Eléphant du PHP | 64 Messages

24 oct. 2017, 09:39

Petite question rapide.
Vu que l'exécution du code s'arrête après un "throw new Exception", qu'est-ce que la "bonne conduite" nous dit de faire pour une condition:

Code : Tout sélectionner

if(!condition) { throw new Exception('Erreur!'); ] else { echo 'on continue'; }

Code : Tout sélectionner

if(!condition) { throw new Exception('Erreur!'); } On continue
Dans les 2 cas, "On continue" ne s'affichera que s'il n'y a pas eu d'exception lancée, mais peut-être qu'une solution est préférable à l'autre?

Merci!

ynx
Eléphant du PHP | 288 Messages

25 oct. 2017, 10:07

Salut,

J'ai une préférence pour le premier cas qui est plus concis. Dans ces cas la différence n'est pas flagrante mais pour des fonctions avec quelques if imbriqués, je trouve la lecture plus claire.
Exemple cas 1 :
function login() {
    if (userExist()) {
        $pass = getPass();
        
        if (passMatch()) {
            $role = getRole();
            
            if ($role) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}
Exemple cas 2 :
function login2() {
    if (!userExist()) {
        return false;
    }
    
    if (!passMatch()) {
        return false;
    }
    
    $role = getRole();
            
    if (!$role) {
        return false;
    }
    
    return true;
}
Bonne journée,

Eléphant du PHP | 64 Messages

25 oct. 2017, 11:24

Ok, il s'agit plus d'une histoire de préférence que d'un code de "bonne conduite" quoi. :)

Merci pour la réponse. :)