Page 1 sur 1

Gestion d'erreur dans une classe

Posté : 11 févr. 2007, 15:35
par jojolapine
Bonjour à tous,
Je suis en train de me créer une petit classe de minibdd sur fichier texte... et j'essaye de faire une gestion des erreurs... seuelement, je n'arrive pas à avoir les bonnes lignes et les bons fichiers, lors d'une erreur... un exemple concret:
fichier dataTxt.classe.php:
<?php

class dataTxt {

  /**
   *  chemin vers le fichier de données
   */     
  private $file=null;
  
  public function __construct($file){
    if(file_exists($file)){
      $this->file=$file;
    } else {
      $this->error("Le fichier sp&eacute;cifi&eacute; n'éxiste pas!");
    }
  }

  
  private function error($message){
    echo "Erreur à la ligne <b>".__LINE__."</b> du fichier <b>".__FILE__;
    echo "</b><br />Message:<br />".$message;
    exit();
  }


}
?>
fichier essai.php:
<?php
include('dataTxt.classe.php');
$essai=new dataTxt('./fichierinconnu.ext');
?>
et voilà l'erreur retournée:
Erreur à la ligne 37 du fichier [...]dataTxt.classe.php
Message:
Le fichier spécifié n'éxiste pas!
alors que j'aurais aimé ceci:
Erreur à la ligne 2 du fichier [...]essai.php
Message:
Le fichier spécifié n'éxiste pas!
Est-ce que ce que je souhaite est faisable ou alors je rêve... ?
Merci d'avance pour d'éventuelles réponses

Posté : 11 févr. 2007, 16:34
par titerm
utilise debug_backtrace() pour remonter d'un cran dans la pile d'appel et avoir les infos sur la zone d'appel de ta fonction

Posté : 11 févr. 2007, 16:41
par jojolapine
Merci bien !
ça fonctionne! voici les modifications:
private function error($message){
    $errors=debug_backtrace();
    echo "Erreur à la ligne <b>".$errors[1]['line']."</b> du fichier <b>".$errors[1]['file'];
    echo "</b><br />Message:<br />".$message;
    exit();
  }
Voilou
=> [résolu]

Posté : 11 févr. 2007, 19:43
par Ajoloca
Bonjour,

Si tu fais de la POO, pourquoi ne pas gérer les erreurs par des exceptions ???

Posté : 11 févr. 2007, 21:31
par jojolapine
Surement parceque je ne connais pas vraiment et ne maitrise pas...
et puis je trouve quand même assez lourd de devoir faire des
 try{
//
} catch(){
//
}
reste assez lourd...
imaginons que les erreurs soient gérer en exeption, j'aurais le code suivant (pour coller à mon exemple plus haut):
<?php
include('dataTxt.classe.php');
try {
    $essai=new dataTxt('./fichierinconnu.ext');
} catch (Exception $e){
    "erreur:".$e->getMessage();
}
?>
tandis que comme je fait actuellement, pour un même résultat, ceci:
<?php
include('dataTxt.classe.php');
$essai=new dataTxt('./fichierinconnu.ext');
?>
fonctionne...
Alors si tu as des arguments pour et que tu arrives à me faire changer d'avis, je veux bien me mettre à apprendre un truc de plus en php...
Aie aie aie!

Posté : 11 févr. 2007, 21:37
par Jules Petibidon
hello,

s'il s'agit d'erreurs de débogage à l'attention du programmeur, tu as une fonction toute faite pour ca : trigger_error() qui te permet de générer des erreurs de type notice, warning, etc. personnalisés.

Posté : 11 févr. 2007, 23:46
par titerm
L'interret de try catch n'apparait effectivement pas sur une seule ligne...

maintenant imagine quelque chose comme ca.
<?php
include('dataTxt.classe.php');
try {
    $essai=new dataTxt('./fichierinconnu.ext');
    $essai->init(param);
    $essai->connect();
    $essai->extract();
    $essai->save();
} catch (Exception $e){
    "erreur:".$e->getMessage();
}
?>
Un seul bloc try catch là où, si tu veux etre rigoureux, il aurait fallut tester le code retour de chaque appel. Soit une pelleter de if et de else avec des messages spécifiques à chaque fois.

Posté : 11 févr. 2007, 23:54
par Ajoloca
Re,

En plus de l'intérêt signalé par titerm c'est que ça t'oblige à faire une programmation propre (tout tester) et comme tu le sais, le manque de tests, c'est le cas de 90% des bogues.

La plus part ne testent pas le retour des fonctions, tu écris une classe, donc QQ chose de réutilisable et le but c'est de bien l'utiliser.

Cette classe peut être utilisée par un autre, et un autre but d'une classe c'est de pouvoir l'utiliser sans savoir comment elle a été écrite.

Les exceptions t'aident à résoudre ces problèmes avec une grande facilité, il suffit de bien écrire la classe et de ce fait, la classe obligera la bonne utilisation..

Posté : 12 févr. 2007, 00:20
par jojolapine
Bon d'accord, je veux bien essayer, mais faudra attendre un peu, parceque ça risque d'être un long au démarrage... :oops:
Je vais voir içi: http://fr.php.net/manual/fr/language.exceptions.php et quand j'ai réussit quelquechose je reviens ;-)