Salut à tous

L'idée que j'ai me semble impossible voir pas affaire, mais je pose quand même la question.

Concernant la gestions des erreurs et exception, elle est pour le moment conçues pour des pages HTML, et ça fonctionne plutôt bien.

Le problème, c'est d'avoir un retour d'erreur, ne serait-ce simpliste lorsqu'il s'agit d'images dynamique avec GD.
Le problème est le même d'ailleurs pour les documents PDF (voir tout documents autre que du html).

J'ai une classe Runfw_Exception qui est dérivée de Exception afin de personnaliser cette gestion des errreurs/exceptions.
Puis coté de mon petit FrameWork maison, au niveau du core (du moteur) ce code (je simplifie) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
// classe Runfw (le core)
 
public function initConfigErrors() {
    set_exception_handler(array('Runfw', 'exceptionHandler'));
    set_error_handler(array('Runfw', 'errorHandler'), E_ALL | E_STRICT);
}
 
public static function errorHandler($code, $error, $file = NULL, $line = NULL, $trace = NULL) {
 
        if ($code) {
            throw new ErrorException($error, $code, 0, $file, $line);
        }
        // Do not execute the PHP error handler
        return TRUE;
}
 
public static function exceptionHandler(Exception $e) {
    $class = get_class($e);
    Runfw_Exception::setException($e->getMessage(), $e->getCode(), $e->getFile(), $e->getLine(), $e->getTrace());
    Runfw_Exception::writeErreur();
    if (IS_DEBUG_EXCEPTION === TRUE) {
        if (is_callable(array($class, 'afficherErreur'))) {
            $class::afficherErreur();
        }
        else {
            Runfw_Exception::afficherErreur();
        }
    }
    return TRUE;
}
Donc toutes Exception sera traitée par la méthode Runfwv::exceptionHandler().
Puis toutes erreurs de Php sera gérée par la méthode Runfw::errorHandler(), qui elle même la renvoie vers un Objet ErrorException, donc devient une exception, qui du coup sera traitée par Runfw::exceptionHandler().

Au niveau de ma classe GdImage (qui une sorte de matrice), je ne vois pas d'autres solution que, qu'en cas d'erreur (ou exception) de générer une image GD afin d'afficher l'erreur, donc en PNG.


Du coup, j'ai créé une classe Runfw_Gd_Exception, et dans cette classe une méthode commune à Runfw_Exception : Runfw_Gd_Exception::afficherErreur().
C'est dans cette méthode ou je génère un PNG contenant le message d'erreur.


Le problème, sans pour autant que ça le soit vraiment car j'ai une solution, je gère les erreur comme ceci :
(dans un code quelconque)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
try {
    // Une erreur
    $truc = $existe_pas;
    // Ou une Exception
    // throw new Exception('quelque chose qui ne va pas.', E_USER_NOTICE);
    //... etc ...
}
catch (Runfw_Gd_Exception $e) {
    //Runfw::exceptionHandler($e);
    throw new Runfw_Gd_Exception($e->getMessage(), $e->getCode(), $e->getPrevious(), $this->width, $this->height);
    exit();
}
catch (ErrorException $e) {
    //Runfw::exceptionHandler($e);
    throw new Runfw_Gd_Exception($e->getMessage(), $e->getCode(), $e->getPrevious(), $this->width, $this->height);
    exit();
}
catch (Exception $e) {
    //Runfw::exceptionHandler($e);
    throw new Runfw_Gd_Exception($e->getMessage(), $e->getCode(), $e->getPrevious(), $this->width, $this->height);
    exit();
}
En faite, habituellement, je fais comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
try {
    $truc = $existe_pas;
}
catch (Exception $e) {
    Runfw::exceptionHandler($e);
}
Et c'est là ma question. (ouf )
J'aurais aimé utilisé ce même code habituel pour catcher/attraper les erreurs, soit Runfw::exceptionHandler($e);
et non : throw new Runfw_Gd_Exception(... etc ...)
En somme, de gérer le cas Html/Gd/Pdf au niveau de Runfw::exceptionHandler(), donc de faire quelque part une alternative pour appeler la méthode afficherErreur selon le type de document.


Ceci me semble impossible car en cas d'erreur ça devient une Exception, et pas une Runfw_GD_Exception. Je perds l'info finalement.
Mais est ce possible ?
Ce n'est pas à faire peut être, c'est farfelu, pas propre, etc ... ?

Si vous avez une idée, sans tomber dans de grandes complexités, je suis preneur.

(désolé pour la longueur, je ne vois pas comment faire plus court).