Gestion d'erreurs

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

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)