Gestion d'erreurs

0/5 (2 avis)

Snippet vu 4 781 fois - Téléchargée 17 fois

Contenu du snippet

Voici une petite ébauche de classe de gestion d'erreurs.
Je m'initie à la POO depuis peu de temps et j'essaye d'apprendre par la pratique donc n'hésitez pas à critiquer/commenter cette source et la façon dont elle est codée.

Voila ses fonctionnalitées:
- Gestion des langues (par fichier XML)
- Log au format CSV
- Ajout d'informations (Fichier, Ligne, Date ... )

(Quelques TODO sont notés en commentaires)

En espérant que cette sources pourra servir.

Source / Exemple :


<?php

// Fichier config de votre site:
// Option de la langue
define('LANG', 'fr');
// Option des logs d'erreurs
$log_errors = array('on' => TRUE,                              // Active le log
		    'file' => '../log/log_errors.csv');         // Chemin du fichier de log
// Option de la lang des erreurs
define('LANG_ERRORS_FILE', '../lng/' . LANG . '/errors.xml');   // Chemin du fichier de lang

class MyException extends Exception {    

	private $error_name; // Nom de l'erreur à retourner
	private $error_mess; // Message de l'erreur à retourner
	private $lang_file;  // Chemin du fichier de langue
	private $log_on;     // Activation du système de log
	private $log_file;   // Chemin du fichier de log

    // Constructeur de la classe.
    public function __construct($error_name, $lang_file, $log) {

		$this->error_name = $error_name;
		$this->lang_file = $lang_file;
		$this->log_on = $log['on'];

		// Activation de la gestion de la langue (TODO: Permettre une desactivation du systeme de langues)
		if (file_exists($this->lang_file)) {

			// Appel de la fonction gérant la langue
			$this->getLang();

		}

		else {
			
			// Sans gestion des Erreurs, on arrête l'application (Pas trouvé comment contourner le problème du "die()" pas élégant.
			$erreur = 'Fatal Error : Gestion des Errors impossible (Fichier de langue des erreurs introuvables.)';
			die ($erreur);

		}

		// Activation des logs
		if ($this->log_on == TRUE) {

			// Assignation du chemin du fichier de log
			$this->log_file = $log['file'];

			if (file_exists($this->log_file)) {

				// Appel de la fonction gérant les Log
				$this->getLog();

			}

			else {
	
				// Si le fichier de log est introuvable, on lance l'exception en désactivant la gestion des logs (TODO: Création automatique du fichier)
				$log_errors = array ('on' => FALSE);
				throw new MyException('log_file', LANG_ERRORS_FILE, $log_errors);

			}

		}

		// Appel du constructeur parent
        parent :: __construct($this->error_mess);

    } // Fin du Constructeur

	// Gestion de la langue
	public function getLang() {

		// Création de l'objet DOM
		$dom = new DomDocument();

		// Ouverture du fichier de langue de erreurs
		$dom->load($this->lang_file);

		// Retourne le contenu du nom du noeud correspondant au nom de l'erreur
  		$noeud = $dom->getElementsByTagName($this->error_name)->item(0);

		// Assigne au message d'erreur son contenu
    	$this->error_mess = $noeud->firstChild->nodeValue;
	}

	// Gestion des logs
	public function getLog() {

		// Ouverture du fichier de log en placant le pointeur à la fin
		$log_file = $this->log_file;
		$flux_export = fopen($log_file, 'a+');
	
		// Ecriture au format CSV dans le log
		fputs($flux_export, $this->getTime() . ',' . $this->getLine() . ',' . $this->error_mess . ',' . $this->getFile() . ','."\n".'');

		// Fermeture du fichier log
		fclose($flux_export);

	}
    
    // Récupération de la date
    public function getTime() {
        return date('Y-m-d H:i:s');
    }
    
    // Méthode retournant le message d'erreur
    public function getError($options) {

        // On retourne un message d'erreur en fonction des options choisies
        $return = '<b>Erreur: ' . $this->getMessage() . '</b><br />';
		if ($options['line'] == TRUE) { $return .= 'Ligne: ' . $this->getLine() . '<br />'; }
		if ($options['file'] == TRUE) { $return .= 'Fichier: ' . $this->getFile() . '<br />'; }
		if ($options['time'] == TRUE) { $return .= 'Heure: ' . $this->getTime() . '<br />'; }

		// Retourne le résultat de l'erreur
        return $return;

    }

}

// Exemple de fichier lang.xml
<?xml version="1.0" encoding="UTF-8"?>
<errors>
		<log_file>Le fichier log est introuvable.</log_file>
		<divisionbyzero>La division par 0 est interdite !</divisionbyzero>
</errors>

// Exemple d'utilisation:

try 
{
    $a = 0; $b = 1;
    if ($a ==0)
    {
        throw new MyException('divisionbyzero', LANG_ERRORS_FILE, $log_errors);
    }
        else
    {
        $c=$b/$a;
    }
}
catch (MyException $e) {
	$options = array('line' => TRUE,   // Active l'affichage de la ligne
			 'file' => TRUE,   // Active l'affichage du nom du fichier
			 'time' => FALSE); // Active l'affichage de l'heure
    echo $e -> getError($options);

}

?>

Conclusion :


Ici la langue est spécifiée par un fichier de configuration mais elle peut très bien l'être par les préférences du navigateur, etc ...

La fonction getError() propose un formattage xHTML ainsi qu'une langue définie tout simplement pour laisser la possilité à l'utilisateur de cette classe de le coupler avec son systeme de template (auquel cas il fera son propre formatage). Ici, j'ai choisis d'intégrer un formatage juste pour améliorer l'esthétique, mais il est évident que l'affichage du français est en contradiction avec la fonctionnalité de langues intégrée.

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
11 août 2008

Oui, comme j'ai spécifié dans la partie conclusion, j'ai fais le choix de penser que l'utilisateur final de la classe l'intégrera à son systeme de template et de langue.
A quoi sert donc un système de gestion de langue spécifique pour les erreurs ? Je dirais que la gestion d'erreur est primordiale dans un projet et qu'il doit à mon avis être le plus autonome possible.
Cependant je conçois que je ne devrais pas imposer ce choix et je vais donc régler le problème le plus vite possible (j'avoue aussi avoir eu la flemme xD)
Messages postés
6
Date d'inscription
samedi 30 octobre 2004
Statut
Membre
Dernière intervention
19 avril 2009

J'ai regardé rapidement, un petit détail me saute cependant aux yeux : la méthode "getError()" qui est censée retourné une erreur dans la langue coreespondant aux fichier de langue choisi, or cette méthode retourne en début d'érreur : "Erreur: " qui est du francais !... avec un fichier de langue en allemand ca peut choquer. Mais je supose que ce n'est qu'un oublie.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_Luzy)