2012-09-24 3 views
0

J'ai écrit un wrapper PDO soigné en classe. J'essaie de comprendre où est le meilleur endroit pour mettre Try/Catch bloquer? Dans le wrapper de classe PDO ou d'autres fichiers?Essayez Catch Block dans l'emballage PDO Classe?

Par exemple:

public function fetchData($sql, $params = array(), $fetchMode = 'all') { 
    try { 
     $this->sth = $this->db->prepare($sql); 
     if (count($params) > 0) 
      $this->setBind($params); 

     $this->sth->execute(); 
     $fetch = ($fetchMode == 'single') ? "fetch" : "fetchAll"; 
     return $this->sth->$fetch(); 
    } catch (PDOException $e) { 
     return $data['error'] = array(
         'status' => 'error', 
         'message' => $e->getMessage() 
        ); 
    } 
} 

Ou dois-je faire comme ça, sans try/catch bloc:

public function fetchData($sql, $params = array(), $fetchMode = 'all') { 
     $this->sth = $this->db->prepare($sql); 
     if (count($params) > 0) 
      $this->setBind($params); 

     $this->sth->execute(); 
     $fetch = ($fetchMode == 'single') ? "fetch" : "fetchAll"; 
     return $this->sth->$fetch(); 
} 

Exemple de requête:

try { 
    $SQL = "SELECT * FROM table"; 
    $result = $db->fetchData($SQL); 
    print_r($result); 
} catch (PDOException $e) { 
    $data['error'] = array(
     'status' => 'error', 
     'message' => $e->getMessage() 
    ); 
} 

Mise à jour: Ce qui serait plus efficace? Par exemple, je ne veux pas répéter try/catch block dans toutes les fonctions ou les fichiers .... et je suis toujours capable de retourner différents "fail-message" sur chacun d'entre eux.

+1

L'écho dans votre premier exemple sent un peu drôle, mais si vous avez retourné l'erreur joliment et renommé la fonction 'tryFetchData' je pense que c'est ok. Ou, utilisez la seconde, mais attrapez la PDOException et lancez la vôtre, de cette façon l'appelant n'a pas besoin de connaître PDOException. –

+0

@lc. Oups, fixe le premier exemple. –

+1

Je ne sais pas si c'est ce que vous cherchez, mais pour des choses comme ça, j'ai tendance à avoir un "runQuery" qui retournera vrai/faux (c'est là que les try/catch sont). getResults() "dans $ result, si c'est faux, j'utilise" getError() "pour lire le message d'erreur que j'aurais mis dans le catch. C'est sous l'hypothèse que vous êtes la fonction de base de données est dans une classe. – Zeritor

Répondre

4

Cela dépend ..

En tant qu'utilisateur de votre classe, j'attendre lors de l'appel fetchData une valeur de retour avec un tableau de données ou faux ou un tableau vide quand il n'y a pas de données ou une erreur. Je ne m'attendrais pas à un tableau avec des informations d'erreur.

  • Lorsque vous utilisez un try/catch dans la classe que vous vous devez saisir les informations d'erreur et rendre disponible comme une propriété/méthode pour vérifier, et laisser fetchData return false, indiquant qu'il ya une erreur. Avoir aucun essai/catch dans votre classe et laisser à l'utilisateur de votre classe peut être une bonne stratégie dans certaines situations. Si l'utilisateur de votre classe a une belle configuration de gestionnaire de excepention global qui avorte gracieusement, par exemple

Mise à jour

Votre code, avec bloc try/catch

class myPDO 
{ 
    private $error; 

    public function fetchData($sql, $params = array(), $fetchMode = 'all') { 
    try { 
     $this->sth = $this->db->prepare($sql); 
     if (count($params) > 0) 
      $this->setBind($params); 

     $this->sth->execute(); 
     $fetch = ($fetchMode == 'single') ? "fetch" : "fetchAll"; 
     return $this->sth->$fetch(); 
    } catch (PDOException $e) { 
     $this->error = array(
         'status' => 'error', 
         'message' => $e->getMessage() 
        ); 

     return false; 
    } 
    } 

    public function error() 
    { 
    return $this->error; 
    } 

} 

Votre code pour non essayer/attraper le bloc reste le même.

+0

S'il vous plaît pourriez mettre à jour votre réponse avec exemple s'il vous plaît ce que vous vouliez dire? –

+0

Merci par exemple .. Maintenant, j'ai compris ce que vous vouliez dire. Lequel fait tu penses que ce serait mieux, essaie/attrape le bloc dans la classe 'myPDO' ou sans? Avoir un bloc try/catch dans d'autres fichiers/modèles –

+0

Si vous n'avez pas de gestionnaire d'exception global installé, qui gère les exceptions avec élégance, vous êtes presque obligé de le faire dans vos classes, n'est-ce pas? – JvdBerg

Questions connexes