Gestion d'erreur dans une classe

ViPHP
ViPHP | 3607 Messages

11 févr. 2007, 15:35

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

Mammouth du PHP | 505 Messages

11 févr. 2007, 16:34

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

ViPHP
ViPHP | 3607 Messages

11 févr. 2007, 16:41

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]

ViPHP
ViPHP | 1961 Messages

11 févr. 2007, 19:43

Bonjour,

Si tu fais de la POO, pourquoi ne pas gérer les erreurs par des exceptions ???
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

11 févr. 2007, 21:31

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!

Eléphant du PHP | 259 Messages

11 févr. 2007, 21:37

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.

Mammouth du PHP | 505 Messages

11 févr. 2007, 23:46

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.

ViPHP
ViPHP | 1961 Messages

11 févr. 2007, 23:54

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..
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

12 févr. 2007, 00:20

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 ;-)