Page 1 sur 1

throw new Exception, quelques questions.

Posté : 09 juin 2007, 19:02
par Hywan
Bonjour,

Je viens envahir le forum PHP 5 maintenant ;)

Eh oui, j'ai passé le cap PHP 4 -> PHP 5 !
Bon niveau objet, c'est le jours et la nuit hehe. Comment j'ai pu faire de le résistance à PHP 5 ... Vraiment trop con moi ...

Je découvre donc toutes les petites astuces de PHP 5, dont les exceptions. Et je me casse les dents à mettre à jours mon Framework ... :sick:

Alors voilà mon problème. En PHP 4, je mettais fait une méthode static pour mon Framework, Fw::raiseError(message, code, arguments), qui lançait une erreur PHP (print, return, trigger ou die, ça dépend le niveau d'erreur qu'on a choisit).
Parfait, mais au niveau des erreurs c'était pas le top, car il ne mettait pas la ligne où avait été déclarée l'erreur mais la ligne où la fonction retournait l'erreur (et là, j'ai perdu 70% de mon auditoire lol). Je m'explique, je veux afficher une erreur ligne 70 du fichier Foo.php avec Fw::raiseError(). La ligne qui va s'afficher, sera la ligne depuis laquelle a été lancé trigger_error (par ex) dans le fichier contenant cette méthode. Donc le numéro de ligne et le fichier sont complètement faux.

Je découvre alors les exceptions, c'est magique ces trucs là.
Un simple, try { throw new Exception(message, code); } catch ( Exception $e ) { echo $e->getLine ou $e->getFile } suffit pour résoudre le problème.
Mais j'utilisais mon raiseError de cette façon là :
if(empty($var))
    return Fw::raiseError('Attention, erreur !', 7);
Et avec les exceptions :
try {
    if(empty($var))
        throw new Exception('Attention, erreur !', 7);
}
catch(Exception $e) {
    echo $e->getCode . ' ' . $e->getMessage() . "\n"; 
}
Vous conviendez avec moi que l'exception est plus lourde en écriture. Mais que le résultat est celui espérer.

Comment réduire l'écriture ? Pour finir en 2 lignes par exemple.


Dans Zend Framework, j'ai aperçu une fois le throw new Zend_*_Exception(...); sans try { } catch () { }. Je pige pas comment ils font ^^


Enfin bref, une piste, un indice ? Merci :)

Posté : 09 juin 2007, 19:37
par Hubert Roksor
Je n'ai pas saisi, en quoi est-ce plus lourd (plus long à taper ?) et à quoi correspond le second argument dans l'Exception que tu throw ?

Je ne sais pas si tu l'as vu dans le manuel, mais tu n'es pas obligé d'avoir un bloc catch partout où tu lances des Exception. Tu peux sans problème mettre des throw partout et attendre que l'exception se fasse attrapper par un catch plus haut. Par exemple
// script principal
try
{
	//include('bar.php');
	bar(0);
}
catch (Exception $e)
{
	echo "Erreur ligne ", $e->getLine();
}

// bar.php
function bar($arg)
{
	return foo($arg);
}

function foo($arg)
{
	if (!$arg)
	{
		throw new Exception('NON! pas 0');
	}
}
Du moment que tu as un catch quelque part au début de ton script qui englobe son exécution, tu es paré. Ou encore, tu peux utiliser set_exception_handler()

Dans le même genre, tu peux aussi re-throw les exception dans le bloc catch, si tu souhaites qu'elles soient attrappées plus haut. Par exemple
try
{
	bar(0);
}
catch (Exception $e)
{
	if ($e->getFile() == '/path/to/bar.php')
	{
		// On re-throw si l'exception vient de bar.php
		// ...en imaginant que ce script a été inclus dans un bloc try supérieur
		throw $e;
	}
	else
	{
		echo 'Erreur...';
	}
}
Je ne sais pas si l'image t'aidera, mais les exceptions sont des petites bulles qui montent jusqu'à ce qu'on les arrête :) Et dans le second exemple tu en arrêtes une quelques instants pour l'examiner puis la relâches pour qu'elle se fasse attraper plus haut :P

Posté : 09 juin 2007, 20:03
par Hywan
Donc throw = champagne, ok j'ai pigé :wink: hehe.

Bien, ça ne résoud que partiellement mon problème. Mais étant pressé, je vais tenter de faire comme dans ton premier exemple (capturer l'exception plus haut).

Edit : le second argument placé dans l'exception c'est le code (numéro) de l'erreur. Voir justement la doc hehe : Documentation PHP : Exceptions étendues.

Merci :)