Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/10/2007, 15h30   #1
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Par défaut [POO] Gérer les exceptions et les erreurs

Bonjour,

Je suis entrain d'écrire un script PHP en PHP 5, j'utilise donc la POO ( trop bon )
J'ai écrit une classe pour étendre la classe existante d'Exception ça marche bien quand je l'attrape avec un catch mais j'aimerais pousser le truc un peu plus loin :
  • J'aimerais que toutes les erreurs de script ( notice, warning, erreur de synthaxe ) utilise ma classe d'exception
  • J'aimerais que toutes les exceptions que j'oublie dans le script utilise aussi ma classe d'exception

J'ai donc écrit ceci dans le fichier commun à toute mon application :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
/**
 * Dérivation des messages d'erreurs 
 */
set_exception_handler('exception_handler');
set_error_handler('exception_handler');
 
function exception_handler($code,$msg)
{
	throw new MyEx($msg,$code);
}
Mais j'ai l'erreur :

Citation:
Fatal error: Exception thrown without a stack frame in Unknown on line 0
Donc j'ai plusieurs questions :
  • Est-ce bien d'écrire tout mon bloc de code dans une condition try pour pouvoir attraper avec des catch mes exceptions ?
  • Les exceptions crée par mon gestionnaire d'exception sont catché ou ?
  • Comment remédier à l'erreur que j'ai cité ?

Pour faire simple je veux avoir un contrôle sur tout ce qui sort de mon script sans que je le veuille pour pouvoir traiter ou enregistrer.
Donc que le visiteur ne voit aucun message d'erreur mais que je puisse en faire ce que je veux


Merci d'avance pour votre aide
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 18h44   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par iowa
J'aimerais que toutes les erreurs de script ( notice, warning, erreur de synthaxe ) utilise ma classe d'exception
Il n'est pas possible de toutes les intercepter : notamment celles qui sont fatales (surtout pour le parser comme les erreurs de syntaxe).

Citation:
Envoyé par iowa
Est-ce bien d'écrire tout mon bloc de code dans une condition try pour pouvoir attraper avec des catch mes exceptions ?
C'est un peu le but, non ? Par ailleurs, cela vous permet d'agir différemment en fonction de l'exception levée. Je vous accorde que ça dépend de ses développements puisque les fonctions natives génèrent à 99% des erreurs.

Citation:
Envoyé par iowa
Les exceptions crée par mon gestionnaire d'exception sont catché ou ?
Comment remédier à l'erreur que j'ai cité ?
Exceptions et PHP5 : Boucle infinie
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 19h42   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 11
Points : 12
Points : 12
oui c'est comme si tu essayer de récupérer avec ton script un "parse error"
TIman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 21h32   #4
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Merci à vous, alors je reformule :

Comment avoir la main sur le maximum d'exception ?
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 00h27   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si vous souhaitez ne montrer aucune erreur il y a des directives prévues pour cela (display_errors) et peuvent être indépendamment logguées dans le journal du serveur (log_errors). La fonction désignée par set_exception_handler est fatale mettant fin au script et ne vous permet pas, pour la raison indiquée plus haut, de lever une nouvelle exception. En revanche, set_error_handler peut tout à fait en lever une.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
set_exception_handler('my_exception_handler');
set_error_handler('my_error_handler');
 
class MyException extends Exception
{
}
 
function my_exception_handler($e)
{
    printf('Exception : %s <br/>', $e->getMessage());
}
 
function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext)
{
    printf('Erreur %d : %s <br/>', $errno, $errstr);
    throw new MyException($errstr, $errno);
}
 
$fp = fopen('non_existant_file', 'r');
Je ne vois pas comment faire mieux.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 07h03   #6
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Oui mais l'objet $e de :

Code :
1
2
 
my_exception_handler
sera un objet MyException ?
Qu'est-ce-qui passera par la fonction my_exception_handler ?
toutes les exceptions ou que celles qui ne sont pas catché ?

Merci pour vos réponses si intéressantes.
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 11h15   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par iowa
sera un objet MyException ?
Qu'est-ce-qui passera par la fonction my_exception_handler ?
toutes les exceptions ou que celles qui ne sont pas catché ?
Non : toute exception qui n'a pas été intercepté (catch) - c'est clairement écrit dans la documentation.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 20h28   #8
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Désolé je ne comprends toujours pas.
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 22h20   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par iowa
Oui mais l'objet $e sera un objet MyException ?
Non pas spécialement : elle sera du type lancé et pas un autre. Si c'est throw new Exception(...), $e sera une simple Exception.

Citation:
Envoyé par iowa
Qu'est-ce-qui passera par la fonction my_exception_handler ?
Uniquement la première qui n'est pas interceptée/gérée par un bloc catch.

Citation:
Envoyé par iowa
toutes les exceptions ou que celles qui ne sont pas catché ?
Celles qui ne sont pas catchées comme dit ci-dessus.

D'où l'intérêt plus que limité de ce que vous voul(i)ez faire
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 06h38   #10
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Merci j'ai tout compris, je vais maintenant tester et vous tenir au courant.
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h30.


 
 
 
 
Partenaires

Hébergement Web