__autoload, et SPL.

ViPHP
ViPHP | 5924 Messages

22 juil. 2007, 02:28

C'est normal que moi, je n'ai pas d'erreur ?
<?php

function __autoload($class)
{

	try
	{
		throw new Exception('test');
	}
	catch(Exception $e)
	{
		echo $e->getmessage();
		include('test_class.php');
	}

}

$test = new test();

?>
(avec une classe test dans le fichier test_class.php)

Vous avez quelle version de php ?

ViPHP
ViPHP | 4674 Messages

22 juil. 2007, 11:18

Ce n'est pas tout à fait le même je crois.
Toi, tu lances et captures une erreur. Nous, on ne fait que la lancer pour la capturer plus loin dans le code. Du fait que tu affiches $e->getMessage(), PHP doit considérer le processus d'exception comme terminé, et donc, pas d'erreur.
Il faudrait que je retrouve cette page où il parlait du bug avec la SPL pour l'autoload ... Peut être qu'on aurait plus d'explications.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

22 juil. 2007, 12:05

Bah c'est bien ce que je disais, si tu laisses l'exception se répandre, ca fait une fatal error, et ce, parce que __autoload() n'est pas appelé par $test = new test(); , mais par le noyau php lui même, et toute exception qui remonte au noyau provoque une erreur (essayez avec ceci par exemple) :
<?php

function except()
{
throw new Exception('test');
}

except();

?>
Normalement, vous devriez avoir une belle fatal error...

ViPHP
ViPHP | 4674 Messages

22 juil. 2007, 12:32

Oui ok. Hmm ... c'est intéressant.
Mais ce que je voulais faire, c'était récupérer l'exception plus loin, mais apparement, ça va être difficile. Je n'ai pas le temps aujourd'hui pour programmer, mais je regarderais ça lundi.

Merci :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Invité
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 16:29

Ben tu stockes la pile des exceptions quelque part, et c'est réglé :)

Un truc de ce genre :
class Autoloader {

  public static function autoload($className) {
    try {
      // ...
    } catch (Exception $e) {
      self::registerException($e);
    }
  }

  protected static $registeredExceptions = array();

  public static function registerException(Exception $e) {
    self::$registeredExceptions[] = $e;
  }

  public static function lastRegisteredException() {
    return array_pop(self::$registeredExceptions);
  }

  public static function countRegisteredExceptions() {
    return count(self::$registeredExceptions);
  }

}

spl_autoload_register(array('Autoloader', 'autoload'));
Comme ça quand une exception est levée dans le loader, il l'attrape, il la met dans une pile, et toi tu as accès à cette pile.

ViPHP
ViPHP | 4674 Messages

23 juil. 2007, 16:45

Oui, c'est ce que je pensais faire :) Problème résolu donc.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).