Bonjour,
J'apprends les exception. Mais, il y a une partie dans le tuto que je comprends pas. Il dit que catch(){} et try{} ne capture pas les éléments et il sont perdu a jamais. J'ai pas trop compris.
<?php
function exception_handler($exception) {
echo "Exception non attrapée : " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Non exécuté\n";
?>
Pour le reste, www.php.net ! C'est quoi l'avantage de set_exception_handler() sur try{} et catch(){}?Je ne comprends absolument pas ta question, mais voici ce qui la documentation :
set_exception_handler() définit le gestionnaire d'exceptions par défaut. La fonction spécifiée sera appelée si une exception est déclenchée et que celle-ci n'est pas gérée par un bloc try/catch.
Pour le reste, http://www.php.net !<?php function exception_handler($exception) { echo "Exception non attrapée : " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Non exécuté\n"; ?>
class myException extends Exception implements Input
{
private $Outputs=array();
private $_Error;
function __construct($str=NULL,$code=0)
{ parent::__construct($str, intval($code));
$this->getError();
}
function setMessage($str=NULL,$code=0)// methode pour peupler parent::message et parent::code "manuellement"
{ parent::__construct($str, intval($code));
$this->getError();
}
function addOutput(Output $obj)// ajout de module de sortie
{ if(!in_array($obj,$this->Outputs)) $this->Outputs[]=$obj;
return $this;
}
public function removeOutput(Output $obs)
{ if (is_int($key = array_search($obs, $this->Outputs, true))) unset($this->_Outputs[$key]);
return $this;
}
function getError()
{ if(count($this->Outputs)==0)
{ if(PHPDEBUG) $this->addOutput(new HtmlDisplay("div",'style="color:#C00"')); // HtmlDisplay est une classe qui envoie l'erreur en html
else $this->addOutput(new UserDisplay()); // UserDisplay est une sortie qui renvoie "un probleme est survenu sans autre details"
}
$this->_Error=array('erreur'=>$this->getCode(),'message'=>$this->getMessage(),'fichier'=>$this->getFile(),'ligne'=>$this->getLine());
$this->Display();
}
function getOutput(Output $obj)
{ try
{ if(in_array($obj,$this->Outputs)) return $this->_Error;
}
catch(Exception $e)
{ $_ENV['Exception']->setMessage($e->getMessage(),$e->getCode());
}
}
function Display()
{ foreach($this->Outputs as $Output)
{ $Output->run($this);
}
}
}
class testdisplay implements Output // une sortie simplette pour l'exemple
{ function run(Input $obj)
{ print_r($obj->getMessage($this));
}
}
$_ENV['exception']=new myException()
$_ENV['exception']->addOutput(new testdisplay());
set_exception_handler(array($_ENV['exception'],'getError'));
Les interfaces Input et Output servent juste à s'assurer que l'entrée de données trouve une sortie qui lui corresponde sans faute, mais ce qui m'importe n'est pas la sortie mais plutôt les entrées. La classe "testdisplay" n'est donc qu'un exemple simplifié.
try
{ echo $ma_variable_qui_nexiste_pas;
}
catch(Exception $e)
{ $_ENV['Exception']->addMessage($e->getMessage,$e->getCode());
}
Ça marche, mais c'est complétement ridicule. On attrape une exception pour en rebalancer une derrière. C'est comme de se payer une porsche mais de devoir la rejoindre à velo.set_exception_handler(array('myException','getError'));
j'obtiens un joli message d'erreur: Non-static method myException::getError() should not be called statically