cvs: peardoc /fr/core/pear/pear-errorstack intro.xml
| From: | Christophe Gesch� | Date: | Sat, 05 Nov 2005 20:56:47 +0000 |
| Subject: | cvs: peardoc /fr/core/pear/pear-errorstack intro.xml | ||
| Groups: | php.pear.doc | ||
| Request: | Send a blank email to pear-doc+get-7143@lists.php.net to get a copy of this message | ||
moosh Sat Nov 5 15:56:47 2005 EDT
Added files:
/peardoc/fr/core/pear/pear-errorstack intro.xml
Log:
- initial translation by Xavier
http://pear.php.net/bugs/bug.php?id=1770
http://cvs.php.net/co.php/peardoc/fr/core/pear/pear-errorstack/intro.xml?r=1.1&p=1 Index: peardoc/fr/core/pear/pear-errorstack/intro.xml +++ peardoc/fr/core/pear/pear-errorstack/intro.xml <?xml version="1.0" encoding="iso-8859-1" ?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.7 Maintainer: moosh Status: started --> <refentry id="core.pear.pear-errorstack.intro"> <refnamediv> <refname> Introduction a l'utilisation de PEAR_ErrorStack pour une gestion avancée des erreurs </refname> <refpurpose> Utiliser PEAR_ErrorStack pour effectuer une gestion des erreurs simple ou avancée. </refpurpose> </refnamediv> <refsynopsisdiv> <refsynopsisdivinfo> <author> <firstname>Gregory</firstname> <surname>Beaver</surname> <authorblurb><para>cellog@php.net</para></authorblurb> </author> <copyright> <year>2003</year> <year>2004</year> <holder>Gregory Beaver</holder> </copyright> <releaseinfo>PEAR_ErrorStack 0.6 (alpha)</releaseinfo> </refsynopsisdivinfo> <simpara>Introduction a l'utilisation de PEAR_ErrorStack</simpara> </refsynopsisdiv> <refsect1 id="core.pear.pear-errorstack.intro.intro"> <title>Introduction</title> <para> Cette classe est disponible en tant que partie du <ulink url="http://pear.php.net/pear">package PEAR</ulink>. Fonctionnalités incluse : <itemizedlist> <listitem> <para> Complètement documentée et fournie avec des tests unitaires complets </para> </listitem> <listitem> <para> Etonnament rapide - noie complètement PEAR_Error </para> </listitem> <listitem><para>Erreurs spécifiques au package</para></listitem> <listitem> <para> Niveaux d'erreurs (notice/avertissement/erreur/exception) </para> </listitem> <listitem> <para> Les données contextuelles de l'erreur sont sauvées indépendamment du message d'erreur </para> </listitem> <listitem> <para> Erreurs en cascade, les erreurs parentes peuvent être spécifiées. </para> </listitem> <listitem> <para> Génération dynamique des messages d'erreur, autorisant la génération de messages d'erreur multiples et distincts à partir du même objet erreur </para> </listitem> <listitem> <para> Des fonctions de rappel (callbacks) sophistiquées sont disponibles, permettant la génération des messages d'erreur, de contextes d'erreurs, voir : <link linkend="core.pear.pear-errorstack.intro.advanced.context">Error Context Display</link>, <link linkend="core.pear.pear-errorstack.intro.advanced.message">Custom Error Message Generation</link>, et <link linkend="core.pear.pear-errorstack.intro.advanced.callback">controlling error generation</link> </para> </listitem> </itemizedlist> </para> <para> PEAR_ErrorStack implémentes une levée et une gestion d'erreurs utilisant le concept de pile. Ceci a d'énormes avantages à comparer de l'implémentation PEAR_Error. PEAR_Error centralise toutes les créations et gestions d'erreurs dans le constructeur de l'objet PEAR_Error. Une fois qu'un objet à été crée, toutes les traitements doivent être terminés, soit en contrôlant la valeur retournée par la méthode soit en utilisant une fonction de rappel locale. De plus, il est quasiment impossible de déterminer la source d'une erreur et l'encombrant bagage des méthodes lentes de la classe de base PEAR accompagne chaque création d'erreur. </para> <para> <programlisting role = "php"> <![CDATA[ <?php // utilisation classique de PEAR_Error require_once 'PEAR.php'; class myobj { // il n'est pas possible de savoir d'où viennent les erreurs function errorCallback($err) { $this->display($err->getMessage()); $this->log($err->getMessage()); } function log($msg) { error_log($msg, 3, 'somefile.log') } function display($msg) { echo $msg . '<br />'; } } $myobj = new myobj; // utilisation d'une fonction de Callback PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array(&$myobj, 'errorCallback')); $ret = SomePackage::doSomething(); if (PEAR::isError($ret)) { // gère l'erreur cette erreur est aussi affichée et loggée } PEAR::pushErrorHandling(PEAR_ERROR_RETURN); $ret = SomePackage::doSomething(); if (PEAR::isError($ret)) { // gère l'erreur - cette erreur n'est pas affichée ni loggée } PEAR::popErrorHandling(); ?>]]> </programlisting> </para> <para> La classe PEAR_ErrorStack ayant hérité du savoir du package <ulink url="http://pear.php.net/Log">Log</ulink>, peut facilement différencier et éventuellement reconditionner des erreurs sans grandes difficultés. </para> <para> <programlisting role = "php"><![CDATA[ <?php // Gestion d'erreurs PEAR_ErrorStack require_once 'PEAR/ErrorStack.php'; require_once 'Log.php'; define('MON_PACKAGE_ERROR_DBERROR', 1); class myobj { var $_stack; function myobj() { $this->_stack = &PEAR_ErrorStack::singleton('monpackage'); } function errorCallback($err) { switch($err['package']){ case 'monpackage': // Dit a la pile d'erreurs de seulement logger l'erreur // Elle ne seras pas poussées sur la pile return PEAR_ERRORSTACK_LOG; break; case 'InternalDbPackage': // re-package ces erreurs comme des erreurs monpackage // a l'attention des utilisateurs finaux $this->_stack->push(MON_PACKAGE_ERROR_DBERROR, 'error', array('dbmessage' => $err['message'], 'dbcode' => $err['code'], 'Nous avons des problème de connection,' . 'veuillez réessayer plus tard'), '', $err); // incluse l'erreur et repackage // Demande a la pile DB erreur interne d'ignorer // cette erreur // comme si elle n'etait jamais arrivée return PEAR_ERRORSTACK_IGNORE; break; } // switch } } $myobj = &new myobj; // Sépare les piles d'erreurs "my package" et DB interne $dbstack = &PEAR_ErrorStack::singleton('InternalDbPackage'); $mystack = &PEAR_ErrorStack::singleton('monpackage'); // Prépare un fichier log utilisant PEAR::Log $log = &Log::Factory('file', 'somefile.log', 'monpackage error log'); $mystack->setLogger($log); // Prépare un log par defaut utilisé pour toutes les piles d'erreurs PEAR_ErrorStack::setDefaultLogger($log); // toutes les erreurs retournées par "my package" sont loggées $ret = SomePackage::doSomething(); // Notez qu'il n'est pas nécéssaire de controler de conditions d'erreurs // sur $ret les erreurs sont completement separées du code. if ($dbstack->hasErrors()) { var_dump($dbstack->getErrors(); } // Utilisation d'un callback $dbstack->setDefaultCallback(array(&$myobj, 'errorCallback')); // toutes les erreurs DB sont repackagées en erreurs "my package" // d'une facon transparente $ret = SomePackage::doSomething(); ?>]]> </programlisting> </para> <para> Pourquoi écrire une nouvelle routine de gestion d'erreurs alors que <link linkend="core.pear.pear-error"><classname>PEAR_Error</classname></link> existe déjà? Il y a un nombre important de problèmes avec <classname>PEAR_Error</classname>. Bien qu'un message d'erreur soit présent dans une classe d'erreur, ce message d'erreur ne peut pas facilement être traduit une fois qu'il a été placé dans PEAR_Error. Il n'existe pas non plus de service standard pour stocker des données associées aux erreurs dans la classe. En plus de ces problèmes de messages d'erreurs, il n'est pas possible de déterminer automatiquement de quel package provient l'objet <classname>PEAR_Error</classname> ou même la sévérité d'une erreur. </para> <para> Le plus gros problème de l'objet <classname>PEAR_Error</classname> est sa conception orientée « mono erreur ». Chaque objet <classname>PEAR_Error</classname> est juste un objet <classname>PEAR_Error</classname>. Il n'y a pas de différenciation entre les sévérités des erreurs ou leurs origines. Le seul moyen de déterminer sa sévérité est d'utiliser PEAR_ERROR_TRIGGER et les constantes E_USER_NOTICE/E_USER_WARNING/E_USER_ERROR de php <ulink url="http://www.php.net/trigger_error">http://www.php.net/trigger_error</ulink>. Mais utiliser ces fonctionnalités ne justifie pas les 900 lignes de code simplement parce que trigger_error() fait partie de PHP lui-même. </para> <para> Maintenant pour commencer à utiliser vos objets d'erreur nouvellement crées, changez tous vos appels <function>PEAR::raiseError</function> ou <function>PEAR::throwError</function> de cette forme ... </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR.php'; // ancienne technique: $error_specific_info = 'bad'; $e = PEAR::raiseError("error message - very " . $error_specific_info . " way to do things", MON_PACKAGE_ERROR_FOO); // une autre ancienne technique: $e = PEAR::throwError("error message - very " . $error_specific_info . " way to do things", MON_PACKAGE_ERROR_FOO); ?>]]> </programlisting> </para> <para>... à quelquechose comme ceci:</para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; // nouvelle méthode // version 1: accès a l'instance de pile $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->push(MON_PACKAGE_ERROR_DBERROR, 'error', array('query' => $query, 'dsn' => $dsn), 'Critical Database Error: Contact Administrator immediately'); // version 2: accès statique singleton : considérablement plus lent PEAR_ErrorStack::staticPush('monpackage', MON_PACKAGE_ERROR_DBERROR, 'error', array('query' => $query, 'dsn' => $dsn), 'Critical Database Error: Contact Administrator immediately'); ?>]]> </programlisting> </para> <para> Dans le cadre d'une utilisation basique, voilà tout ce qui est nécessaire de faire pour utiliser le package PEAR_ErrorStack à la place de PEAR_Error. </para> </refsect1> <refsect1 id = "core.pear.pear-errorstack.intro.advanced"> <title>Fonctionnalités avancées</title> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.context"> <title>Affichage du contexte d'une erreur</title> <para> Dans certains cas, vous pouvez souhaiter personnaliser la génération des erreurs. Par exemple, pour beaucoup d'exceptions, il est utile d'inclure comme informations contextuelles : le nom de fichier, le numéro de ligne et le nom de la classe/fonction afin de tracer l'erreur. Une option par défaut est disponible et sera suffisante dans la majorité des cas, c'est : <link linkend="core.pear.pear-errorstack.getfileline"><function>PEAR_ErrorStack::getFileLine</function></link>. </para> <para> Toutes les erreurs de package n'apparaissent pas dans le fichier source PHP lui même. Par exemple, les erreurs de compilation d'un moteur de templates apparaissent dans le fichier source du modèle, les erreurs de base de données peuvent se produire dans le texte d'une requête, ou d'une maniere interne au serveur de base de données, les erreurs propres aux packages Internet peuvent apparaître sur un autre serveur. Toutes ces informations peuvent être incluses dans un message d'erreur en utilisant une fonction de rappel capturant le contexte. </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; class DatabaseClass { var $_dbError; var $_dbErrorMsg; var $_dbQuery; var $_dbPos; /** * Context grabber for the Database package * @param integer Error Code * @param array Error parameters passed into {@link PEAR_ErrorStack::push()} * @param array Output of debug_backtrace() (not used in this callback) */ function getErrorContext($code, $params, $backtrace) { $context = array( 'errorcode' => $this->_dbError, 'errormsg' => $this->_dbErrorMsg, 'query' => $this->_dbQuery, 'pos' => $this->_dbPos, ); return $context; } } $db = new DatabaseClass; PEAR_ErrorStack::staticSetContextCallback('Database', array(&$db, 'getErrorContext')); ?>]]> </programlisting> </para> <para> L'information contextuelle est formatée pour être facilement traitée par une application externe. Si vous souhaitez que les informations contextuelles soient incluses dans le message d'erreur, la fonction de rappel de message d'erreur devrait être utilisée pour ajouter cette information d'une manière humainement lisible au message d'erreur, comme décrit dans la section suivante. </para> </refsect2> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.message"> <title>Génération de Messages d'Erreur Personnalisés</title> <para> Il y a trois méthodes de PEAR_ErrorStack prévues pour générer des messages d'erreur d'une manière efficace. Pour les utiliser, vous devez faire une des deux choses suivantes : <itemizedlist> <listitem> <para> Appeler <link linkend="core.pear.pear-errorstack.seterrormessagetemplate"><function>PEAR_ErrorStack::setErrorMessageTemplate</function></link>, et configurer un tableau en mettant en correspondance les codes d'erreurs et les modèles correspondants, comme ci-dessous : </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERREUR_UN', 1); define('ERREUR_DEUX', 2); define('ERREUR_TROIS', 3); define('ERREUR_QUATRE', 4); require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage'); $messages = array( ERREUR_UN => 'The gronk number %num% dropped a %thing%', ERREUR_DEUX => 'The %list% items were missing', ERREUR_TROIS => 'I like chocolate, how about %you%?', ERREUR_QUATRE => 'and a %partridge% in a pear %tree%', ); $stack->setErrorMessageTemplate($messages); ?>]]> </programlisting> </para> <para> La substitution est faite en utilisant : <ulink url="http://www.php.net/str_replace">str_replace</ulink>, et est très simple. D'une manière basique, si un nom de variable est entouré de signes pourcentage (%), il sera remplacé par la valeur passée dans le tableau associatif. Si un tableau est passé en paramètre à la méthode, <programlisting role = "php"> array('nomvar' => 'valeur'); </programlisting> toutes les occurrences de %nomvar% seront remplacées par leur valeur. </para> <para> De plus, si les valeurs passées sont des objets, les méthodes de substitution chercheront dans l'objet une méthode nommée "<function>__toString()</function>" et si trouvée, l'utiliseront pour convertir l'objet en chaîne. Si un tableau de chaînes est passé, elles seront jointes par des virgules. <programlisting role = "php"><![CDATA[ <?php array('nomvar' => array('premier', 'second', 'tiers')); // Ca deviendra 'premier, second, tiers' ?>]]> </programlisting> </para> </listitem> <listitem> <para> Appeler <link linkend="core.pear.pear-errorstack.setmessagecallback"><function>PEAR_ErrorStack::setMessageCallback</function></link>, et paramétrer une fonction ou méthode générant un message d'erreur personnalisé. Ceci est probablement la meilleur option dans la majorité des situations complexes, dans la mesure ou cela autorise les utilisateurs à remplacer ou même étendre la fonction de callback existante en utilisant <link linkend="core.pear.pear-errorstack.getmessagecallback"><function>PEAR_ErrorStack::getMessageCallback</function></link>. Par exemple: <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; class foo { var $_oldcallback; function callback(&$stack, $err) { $message = call_user_func_array($this->_oldcallback, array(&$stack, $err)); $message .= "File " . $err['context']['file']; return $message; } } $a = new foo; $stack = &PEAR_ErrorStack::singleton('otherpackage'); $a->_oldcallback = $stack->getMessageCallback('otherpackage'); $stack->setMessageCallback(array(&$a, 'callback')); ?>]]> </programlisting> </para> </listitem> <listitem> <para> Étendre PEAR_ErrorStack avec votre propre classe et remplacer <link linkend="core.pear.pear-errorstack.geterrormessagetemplate"><function>PEAR_ErrorStack::getErrorMessageTemplate</function></link> ou <link linkend="core.pear.pear-errorstack.geterrormessage"><function>PEAR_ErrorStack::getErrorMessage</function></link>. Afin de garantir que cette classe sera utilisée par d'autres packages / applications, utilisez ce code juste après la déclaration de la classe : </para> <para> <programlisting role = "php"><![CDATA[ <?php PEAR_ErrorStack::singleton('monpackage', false, null, 'MyPEAR_ErrorStack'); ?>]]> </programlisting> </para> </listitem> </itemizedlist> </para> </refsect2> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.callback"> <title>Contrôler la génération des erreurs</title> <para> Il existe plusieurs scénarios dans lesquels le contrôle d'une fine granularité sur la levée d'une erreur est absolument nécessaire. Une fonction générique de callback de gestion des erreurs implique que chaque erreur levée sera gérée dans la même fonction de rappel. Même si PEAR_ErrorStack est conçue pour opérer avec des fonctions de rappel indépendantes pour chaque package, une gestion générique est possible a travers la méthode <link linkend="core.pear.pear-errorstack.staticpushcallback"><function>PEAR_ErrorStack::staticPushCallback</function></link> Ce n'est pas différent du mode de gestion d'erreurs de PEAR_Error : PEAR_ERROR_CALLBACK </para> <para> La puissance réelle de PEAR_ErrorStack vient du mécanisme de callback lui-même. Le mécanisme de callback PEAR_Error n'a pas vraiment d'effet sur le message d'erreur Tous les traitements d'erreurs doivent être effectuées dans la méthode ou fonction de rappel elle-même. Le mécanisme de rappel PEAR_ErrorStack peut influencer l'erreur à travers l'utilisation de trois constantes : <itemizedlist> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_IGNORE</constant></link> </para> </listitem> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_PUSH</constant></link> </para> </listitem> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_LOG</constant></link> </para> </listitem> </itemizedlist> </para> <para> PEAR_ERRORSTACK_IGNORE informe la pile quelle doit ignorer l'erreur, comme si elle n'était jamais arrivée. L'erreur ne sera ni loguée, ni empilée sur la pile. Elle pourra cependant être retournée par <link linkend="core.pear.pear-errorstack.push"><function>PEAR_ErrorStack::push</function></link> </para> <para> PEAR_ERRORSTACK_PUSH informe la pile qu'elle doit empiler l'erreur sur la pile des erreurs, mais ne pas la loguer.. </para> <para> PEAR_ERRORSTACK_LOG informe la pile qu'elle ne doit pas empiler l'erreur mais seulement la logger ; </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERROR_CODE_ONE',1); define('ERROR_CODE_TWO',2); define('ERROR_CODE_THREE',3); require_once 'PEAR/ErrorStack.php'; require_once 'Log.php'; function somecallback($err) { switch($err['code']){ case ERROR_CODE_ONE: return PEAR_ERRORSTACK_IGNORE; break; case ERROR_CODE_TWO: return PEAR_ERRORSTACK_PUSH; break; case ERROR_CODE_THREE: return PEAR_ERRORSTACK_LOG; break; } // switch } $log = &Log::factory('display'); $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->setLogger($log); $stack->pushCallback('somecallback'); $stack->push(ERROR_CODE_ONE); $stack->push(ERROR_CODE_TWO); $stack->push(ERROR_CODE_THREE); var_dump(PEAR_ErrorStack::staticGetErrors()); // simule PEAR_ERROR_CALLBACK avec des callbacks specifiques pour // monpackage. // Chaque autre package loggera simplemenet l'erreur, // seulement les erreurs mypackage sont poussées sur la pile d'une maniere // conditionnelle class myclass { function acallback($err) { return PEAR_ERRORSTACK_LOG; } } $stack2 = PEAR_ErrorStack::singleton('anotherpackage'); $stack3 = &PEAR_ErrorStack::singleton('thirdpackage'); PEAR_ErrorStack::setDefaultCallback(array('myclass', 'acallback')); ?>]]> </programlisting> </para> <refsect3 id = "core.pear.pear-errorstack.intro.advanced.callback.repackage"> <title>Reconditionner les erreurs d'un package à un autre</title> <para> L'usage le plus évident d'une fonction de callback d'erreurs implique un scénario commun à beaucoup d'applications niveau utilisateur qui emploient des packages système. Si vous écrivez un Système de gestion de contenu (CMS) en utilisant le package PEAR DB, c'est généralement une mauvaise idée d'afficher des erreurs du niveau base de données quand un utilisateur clique sur un lien pour ajouter un message à un forum. PEAR_ErrorStack peut être utilisée pour reconditionner cette erreur comme une erreur propre à votre package. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('MON_PACKAGE_ERROR_DBDOWN',1); require_once 'PEAR/ErrorStack.php'; function repackage($err) { if ($err['package'] == 'DB') { $mystack = &PEAR_ErrorStack::singleton('monpackage'); $mystack->push(MON_PACKAGE_ERROR_DBDOWN, 'error', array('olderror' => $err)); // ignore lerreur DB , // mais la sauve dans lerreur monpackage pour loguer return PEAR_ERRORSTACK_IGNORE; } } ?>]]> </programlisting> </para> </refsect3> <refsect3 id = "core.pear.pear-errorstack.intro.advanced.callback.silence"> <title>Emulation de lopérateur @</title> <para> Une des forces de PEAR_Error difficile a utiliser implique la méthode <link linkend="core.pear.pear.expecterror"><function>PEAR::expectError</function></link>. Il est possible de rendre silencieuses les erreurs régulieres php en utilisant lopérateur @ de la façon suivante : </para> <para> <programlisting role = "php"><![CDATA[ <?php @file_get_contents(); ?>]]> </programlisting> </para> <para> Emuler ce comportement à laide de PEAR_ErrorStack est simple. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERROR_CODE_SOMETHING', 1); require_once 'PEAR/ErrorStack.php'; function silence($err) { // ignore toutes les erreurs return PEAR_ERRORSTACK_IGNORE; } $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->pushCallback('silence'); $stack->push(ERROR_CODE_SOMETHING); ?>]]> </programlisting> </para> <para> PEAR_ErrorStack peut passer un cran au dessus et seulement loguer les erreurs ou seulement les placer sur la pile derreurs en utilisant les deux autres constantes. Finalement, des erreurs particulières peuvent être levées et toutes les autres ignorées. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('SOMEPACKAGE_ERROR_THING', 1); require_once 'PEAR/ErrorStack.php'; function silenceSome($err) { if ($err['package'] != 'somepackage') { // ignore toutes les erreurs dautres packages return PEAR_ERROR_IGNORE; } if ($err['code'] != SOMEPACKAGE_ERROR_THING) { // ignore tous les autres codes derreurs return PEAR_ERRORSTACK_IGNORE; } } $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->pushCallback('silenceSome'); $stack->push(ERROR_CODE_SOMETHING); ?>]]> </programlisting> </para> </refsect3> </refsect2> </refsect1> <refsect1 id = "core.pear.pear-errorstack.intro.merging"> <title> Compatibilité descendante avec PEAR_Error, et ascendante avec les exceptions PHP5 </title> <para> <classname>PEAR_ErrorStack</classname> peut être aussi programmée pour automatiquement générer un objet PEAR_Error utilisant <link linkend="core.pear.pear.raiseerror"><function>PEAR::raiseError</function></link>, il suffit simplement de passer le paramètre Pear_Error compatibility à vrai de la manière suivante : </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage', false, null, 'PEAR_ErrorStack', true); ?>]]> </programlisting> </para> <para> PEAR_ErrorStack retournera une exception automatiquement en PHP5. Vous pouvez fixer le nom de lexception qui sera retournée en utilisant le code suivant : </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage', false, null, 'PEAR_ErrorStack', false, 'MyException'); ?>]]> </programlisting> </para> </refsect1> </refentry> <!-- Generated by phpDocumentor v 1.3.0RC3 http://www.phpdoc.org --> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->
http://cvs.php.net/co.php/peardoc/fr/core/pear/pear-errorstack/intro.xml?r=1.1&p=1 Index: peardoc/fr/core/pear/pear-errorstack/intro.xml +++ peardoc/fr/core/pear/pear-errorstack/intro.xml <?xml version="1.0" encoding="iso-8859-1" ?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.7 Maintainer: moosh Status: started --> <refentry id="core.pear.pear-errorstack.intro"> <refnamediv> <refname> Introduction a l'utilisation de PEAR_ErrorStack pour une gestion avancée des erreurs </refname> <refpurpose> Utiliser PEAR_ErrorStack pour effectuer une gestion des erreurs simple ou avancée. </refpurpose> </refnamediv> <refsynopsisdiv> <refsynopsisdivinfo> <author> <firstname>Gregory</firstname> <surname>Beaver</surname> <authorblurb><para>cellog@php.net</para></authorblurb> </author> <copyright> <year>2003</year> <year>2004</year> <holder>Gregory Beaver</holder> </copyright> <releaseinfo>PEAR_ErrorStack 0.6 (alpha)</releaseinfo> </refsynopsisdivinfo> <simpara>Introduction a l'utilisation de PEAR_ErrorStack</simpara> </refsynopsisdiv> <refsect1 id="core.pear.pear-errorstack.intro.intro"> <title>Introduction</title> <para> Cette classe est disponible en tant que partie du <ulink url="http://pear.php.net/pear">package PEAR</ulink>. Fonctionnalités incluse : <itemizedlist> <listitem> <para> Complètement documentée et fournie avec des tests unitaires complets </para> </listitem> <listitem> <para> Etonnament rapide - noie complètement PEAR_Error </para> </listitem> <listitem><para>Erreurs spécifiques au package</para></listitem> <listitem> <para> Niveaux d'erreurs (notice/avertissement/erreur/exception) </para> </listitem> <listitem> <para> Les données contextuelles de l'erreur sont sauvées indépendamment du message d'erreur </para> </listitem> <listitem> <para> Erreurs en cascade, les erreurs parentes peuvent être spécifiées. </para> </listitem> <listitem> <para> Génération dynamique des messages d'erreur, autorisant la génération de messages d'erreur multiples et distincts à partir du même objet erreur </para> </listitem> <listitem> <para> Des fonctions de rappel (callbacks) sophistiquées sont disponibles, permettant la génération des messages d'erreur, de contextes d'erreurs, voir : <link linkend="core.pear.pear-errorstack.intro.advanced.context">Error Context Display</link>, <link linkend="core.pear.pear-errorstack.intro.advanced.message">Custom Error Message Generation</link>, et <link linkend="core.pear.pear-errorstack.intro.advanced.callback">controlling error generation</link> </para> </listitem> </itemizedlist> </para> <para> PEAR_ErrorStack implémentes une levée et une gestion d'erreurs utilisant le concept de pile. Ceci a d'énormes avantages à comparer de l'implémentation PEAR_Error. PEAR_Error centralise toutes les créations et gestions d'erreurs dans le constructeur de l'objet PEAR_Error. Une fois qu'un objet à été crée, toutes les traitements doivent être terminés, soit en contrôlant la valeur retournée par la méthode soit en utilisant une fonction de rappel locale. De plus, il est quasiment impossible de déterminer la source d'une erreur et l'encombrant bagage des méthodes lentes de la classe de base PEAR accompagne chaque création d'erreur. </para> <para> <programlisting role = "php"> <![CDATA[ <?php // utilisation classique de PEAR_Error require_once 'PEAR.php'; class myobj { // il n'est pas possible de savoir d'où viennent les erreurs function errorCallback($err) { $this->display($err->getMessage()); $this->log($err->getMessage()); } function log($msg) { error_log($msg, 3, 'somefile.log') } function display($msg) { echo $msg . '<br />'; } } $myobj = new myobj; // utilisation d'une fonction de Callback PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array(&$myobj, 'errorCallback')); $ret = SomePackage::doSomething(); if (PEAR::isError($ret)) { // gère l'erreur cette erreur est aussi affichée et loggée } PEAR::pushErrorHandling(PEAR_ERROR_RETURN); $ret = SomePackage::doSomething(); if (PEAR::isError($ret)) { // gère l'erreur - cette erreur n'est pas affichée ni loggée } PEAR::popErrorHandling(); ?>]]> </programlisting> </para> <para> La classe PEAR_ErrorStack ayant hérité du savoir du package <ulink url="http://pear.php.net/Log">Log</ulink>, peut facilement différencier et éventuellement reconditionner des erreurs sans grandes difficultés. </para> <para> <programlisting role = "php"><![CDATA[ <?php // Gestion d'erreurs PEAR_ErrorStack require_once 'PEAR/ErrorStack.php'; require_once 'Log.php'; define('MON_PACKAGE_ERROR_DBERROR', 1); class myobj { var $_stack; function myobj() { $this->_stack = &PEAR_ErrorStack::singleton('monpackage'); } function errorCallback($err) { switch($err['package']){ case 'monpackage': // Dit a la pile d'erreurs de seulement logger l'erreur // Elle ne seras pas poussées sur la pile return PEAR_ERRORSTACK_LOG; break; case 'InternalDbPackage': // re-package ces erreurs comme des erreurs monpackage // a l'attention des utilisateurs finaux $this->_stack->push(MON_PACKAGE_ERROR_DBERROR, 'error', array('dbmessage' => $err['message'], 'dbcode' => $err['code'], 'Nous avons des problème de connection,' . 'veuillez réessayer plus tard'), '', $err); // incluse l'erreur et repackage // Demande a la pile DB erreur interne d'ignorer // cette erreur // comme si elle n'etait jamais arrivée return PEAR_ERRORSTACK_IGNORE; break; } // switch } } $myobj = &new myobj; // Sépare les piles d'erreurs "my package" et DB interne $dbstack = &PEAR_ErrorStack::singleton('InternalDbPackage'); $mystack = &PEAR_ErrorStack::singleton('monpackage'); // Prépare un fichier log utilisant PEAR::Log $log = &Log::Factory('file', 'somefile.log', 'monpackage error log'); $mystack->setLogger($log); // Prépare un log par defaut utilisé pour toutes les piles d'erreurs PEAR_ErrorStack::setDefaultLogger($log); // toutes les erreurs retournées par "my package" sont loggées $ret = SomePackage::doSomething(); // Notez qu'il n'est pas nécéssaire de controler de conditions d'erreurs // sur $ret les erreurs sont completement separées du code. if ($dbstack->hasErrors()) { var_dump($dbstack->getErrors(); } // Utilisation d'un callback $dbstack->setDefaultCallback(array(&$myobj, 'errorCallback')); // toutes les erreurs DB sont repackagées en erreurs "my package" // d'une facon transparente $ret = SomePackage::doSomething(); ?>]]> </programlisting> </para> <para> Pourquoi écrire une nouvelle routine de gestion d'erreurs alors que <link linkend="core.pear.pear-error"><classname>PEAR_Error</classname></link> existe déjà? Il y a un nombre important de problèmes avec <classname>PEAR_Error</classname>. Bien qu'un message d'erreur soit présent dans une classe d'erreur, ce message d'erreur ne peut pas facilement être traduit une fois qu'il a été placé dans PEAR_Error. Il n'existe pas non plus de service standard pour stocker des données associées aux erreurs dans la classe. En plus de ces problèmes de messages d'erreurs, il n'est pas possible de déterminer automatiquement de quel package provient l'objet <classname>PEAR_Error</classname> ou même la sévérité d'une erreur. </para> <para> Le plus gros problème de l'objet <classname>PEAR_Error</classname> est sa conception orientée « mono erreur ». Chaque objet <classname>PEAR_Error</classname> est juste un objet <classname>PEAR_Error</classname>. Il n'y a pas de différenciation entre les sévérités des erreurs ou leurs origines. Le seul moyen de déterminer sa sévérité est d'utiliser PEAR_ERROR_TRIGGER et les constantes E_USER_NOTICE/E_USER_WARNING/E_USER_ERROR de php <ulink url="http://www.php.net/trigger_error">http://www.php.net/trigger_error</ulink>. Mais utiliser ces fonctionnalités ne justifie pas les 900 lignes de code simplement parce que trigger_error() fait partie de PHP lui-même. </para> <para> Maintenant pour commencer à utiliser vos objets d'erreur nouvellement crées, changez tous vos appels <function>PEAR::raiseError</function> ou <function>PEAR::throwError</function> de cette forme ... </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR.php'; // ancienne technique: $error_specific_info = 'bad'; $e = PEAR::raiseError("error message - very " . $error_specific_info . " way to do things", MON_PACKAGE_ERROR_FOO); // une autre ancienne technique: $e = PEAR::throwError("error message - very " . $error_specific_info . " way to do things", MON_PACKAGE_ERROR_FOO); ?>]]> </programlisting> </para> <para>... à quelquechose comme ceci:</para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; // nouvelle méthode // version 1: accès a l'instance de pile $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->push(MON_PACKAGE_ERROR_DBERROR, 'error', array('query' => $query, 'dsn' => $dsn), 'Critical Database Error: Contact Administrator immediately'); // version 2: accès statique singleton : considérablement plus lent PEAR_ErrorStack::staticPush('monpackage', MON_PACKAGE_ERROR_DBERROR, 'error', array('query' => $query, 'dsn' => $dsn), 'Critical Database Error: Contact Administrator immediately'); ?>]]> </programlisting> </para> <para> Dans le cadre d'une utilisation basique, voilà tout ce qui est nécessaire de faire pour utiliser le package PEAR_ErrorStack à la place de PEAR_Error. </para> </refsect1> <refsect1 id = "core.pear.pear-errorstack.intro.advanced"> <title>Fonctionnalités avancées</title> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.context"> <title>Affichage du contexte d'une erreur</title> <para> Dans certains cas, vous pouvez souhaiter personnaliser la génération des erreurs. Par exemple, pour beaucoup d'exceptions, il est utile d'inclure comme informations contextuelles : le nom de fichier, le numéro de ligne et le nom de la classe/fonction afin de tracer l'erreur. Une option par défaut est disponible et sera suffisante dans la majorité des cas, c'est : <link linkend="core.pear.pear-errorstack.getfileline"><function>PEAR_ErrorStack::getFileLine</function></link>. </para> <para> Toutes les erreurs de package n'apparaissent pas dans le fichier source PHP lui même. Par exemple, les erreurs de compilation d'un moteur de templates apparaissent dans le fichier source du modèle, les erreurs de base de données peuvent se produire dans le texte d'une requête, ou d'une maniere interne au serveur de base de données, les erreurs propres aux packages Internet peuvent apparaître sur un autre serveur. Toutes ces informations peuvent être incluses dans un message d'erreur en utilisant une fonction de rappel capturant le contexte. </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; class DatabaseClass { var $_dbError; var $_dbErrorMsg; var $_dbQuery; var $_dbPos; /** * Context grabber for the Database package * @param integer Error Code * @param array Error parameters passed into {@link PEAR_ErrorStack::push()} * @param array Output of debug_backtrace() (not used in this callback) */ function getErrorContext($code, $params, $backtrace) { $context = array( 'errorcode' => $this->_dbError, 'errormsg' => $this->_dbErrorMsg, 'query' => $this->_dbQuery, 'pos' => $this->_dbPos, ); return $context; } } $db = new DatabaseClass; PEAR_ErrorStack::staticSetContextCallback('Database', array(&$db, 'getErrorContext')); ?>]]> </programlisting> </para> <para> L'information contextuelle est formatée pour être facilement traitée par une application externe. Si vous souhaitez que les informations contextuelles soient incluses dans le message d'erreur, la fonction de rappel de message d'erreur devrait être utilisée pour ajouter cette information d'une manière humainement lisible au message d'erreur, comme décrit dans la section suivante. </para> </refsect2> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.message"> <title>Génération de Messages d'Erreur Personnalisés</title> <para> Il y a trois méthodes de PEAR_ErrorStack prévues pour générer des messages d'erreur d'une manière efficace. Pour les utiliser, vous devez faire une des deux choses suivantes : <itemizedlist> <listitem> <para> Appeler <link linkend="core.pear.pear-errorstack.seterrormessagetemplate"><function>PEAR_ErrorStack::setErrorMessageTemplate</function></link>, et configurer un tableau en mettant en correspondance les codes d'erreurs et les modèles correspondants, comme ci-dessous : </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERREUR_UN', 1); define('ERREUR_DEUX', 2); define('ERREUR_TROIS', 3); define('ERREUR_QUATRE', 4); require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage'); $messages = array( ERREUR_UN => 'The gronk number %num% dropped a %thing%', ERREUR_DEUX => 'The %list% items were missing', ERREUR_TROIS => 'I like chocolate, how about %you%?', ERREUR_QUATRE => 'and a %partridge% in a pear %tree%', ); $stack->setErrorMessageTemplate($messages); ?>]]> </programlisting> </para> <para> La substitution est faite en utilisant : <ulink url="http://www.php.net/str_replace">str_replace</ulink>, et est très simple. D'une manière basique, si un nom de variable est entouré de signes pourcentage (%), il sera remplacé par la valeur passée dans le tableau associatif. Si un tableau est passé en paramètre à la méthode, <programlisting role = "php"> array('nomvar' => 'valeur'); </programlisting> toutes les occurrences de %nomvar% seront remplacées par leur valeur. </para> <para> De plus, si les valeurs passées sont des objets, les méthodes de substitution chercheront dans l'objet une méthode nommée "<function>__toString()</function>" et si trouvée, l'utiliseront pour convertir l'objet en chaîne. Si un tableau de chaînes est passé, elles seront jointes par des virgules. <programlisting role = "php"><![CDATA[ <?php array('nomvar' => array('premier', 'second', 'tiers')); // Ca deviendra 'premier, second, tiers' ?>]]> </programlisting> </para> </listitem> <listitem> <para> Appeler <link linkend="core.pear.pear-errorstack.setmessagecallback"><function>PEAR_ErrorStack::setMessageCallback</function></link>, et paramétrer une fonction ou méthode générant un message d'erreur personnalisé. Ceci est probablement la meilleur option dans la majorité des situations complexes, dans la mesure ou cela autorise les utilisateurs à remplacer ou même étendre la fonction de callback existante en utilisant <link linkend="core.pear.pear-errorstack.getmessagecallback"><function>PEAR_ErrorStack::getMessageCallback</function></link>. Par exemple: <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; class foo { var $_oldcallback; function callback(&$stack, $err) { $message = call_user_func_array($this->_oldcallback, array(&$stack, $err)); $message .= "File " . $err['context']['file']; return $message; } } $a = new foo; $stack = &PEAR_ErrorStack::singleton('otherpackage'); $a->_oldcallback = $stack->getMessageCallback('otherpackage'); $stack->setMessageCallback(array(&$a, 'callback')); ?>]]> </programlisting> </para> </listitem> <listitem> <para> Étendre PEAR_ErrorStack avec votre propre classe et remplacer <link linkend="core.pear.pear-errorstack.geterrormessagetemplate"><function>PEAR_ErrorStack::getErrorMessageTemplate</function></link> ou <link linkend="core.pear.pear-errorstack.geterrormessage"><function>PEAR_ErrorStack::getErrorMessage</function></link>. Afin de garantir que cette classe sera utilisée par d'autres packages / applications, utilisez ce code juste après la déclaration de la classe : </para> <para> <programlisting role = "php"><![CDATA[ <?php PEAR_ErrorStack::singleton('monpackage', false, null, 'MyPEAR_ErrorStack'); ?>]]> </programlisting> </para> </listitem> </itemizedlist> </para> </refsect2> <refsect2 id = "core.pear.pear-errorstack.intro.advanced.callback"> <title>Contrôler la génération des erreurs</title> <para> Il existe plusieurs scénarios dans lesquels le contrôle d'une fine granularité sur la levée d'une erreur est absolument nécessaire. Une fonction générique de callback de gestion des erreurs implique que chaque erreur levée sera gérée dans la même fonction de rappel. Même si PEAR_ErrorStack est conçue pour opérer avec des fonctions de rappel indépendantes pour chaque package, une gestion générique est possible a travers la méthode <link linkend="core.pear.pear-errorstack.staticpushcallback"><function>PEAR_ErrorStack::staticPushCallback</function></link> Ce n'est pas différent du mode de gestion d'erreurs de PEAR_Error : PEAR_ERROR_CALLBACK </para> <para> La puissance réelle de PEAR_ErrorStack vient du mécanisme de callback lui-même. Le mécanisme de callback PEAR_Error n'a pas vraiment d'effet sur le message d'erreur Tous les traitements d'erreurs doivent être effectuées dans la méthode ou fonction de rappel elle-même. Le mécanisme de rappel PEAR_ErrorStack peut influencer l'erreur à travers l'utilisation de trois constantes : <itemizedlist> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_IGNORE</constant></link> </para> </listitem> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_PUSH</constant></link> </para> </listitem> <listitem> <para> <link linkend="core.pear.pear-errorstack.constants.details.errorstack---php"><constant>PEAR_ERRORSTACK_LOG</constant></link> </para> </listitem> </itemizedlist> </para> <para> PEAR_ERRORSTACK_IGNORE informe la pile quelle doit ignorer l'erreur, comme si elle n'était jamais arrivée. L'erreur ne sera ni loguée, ni empilée sur la pile. Elle pourra cependant être retournée par <link linkend="core.pear.pear-errorstack.push"><function>PEAR_ErrorStack::push</function></link> </para> <para> PEAR_ERRORSTACK_PUSH informe la pile qu'elle doit empiler l'erreur sur la pile des erreurs, mais ne pas la loguer.. </para> <para> PEAR_ERRORSTACK_LOG informe la pile qu'elle ne doit pas empiler l'erreur mais seulement la logger ; </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERROR_CODE_ONE',1); define('ERROR_CODE_TWO',2); define('ERROR_CODE_THREE',3); require_once 'PEAR/ErrorStack.php'; require_once 'Log.php'; function somecallback($err) { switch($err['code']){ case ERROR_CODE_ONE: return PEAR_ERRORSTACK_IGNORE; break; case ERROR_CODE_TWO: return PEAR_ERRORSTACK_PUSH; break; case ERROR_CODE_THREE: return PEAR_ERRORSTACK_LOG; break; } // switch } $log = &Log::factory('display'); $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->setLogger($log); $stack->pushCallback('somecallback'); $stack->push(ERROR_CODE_ONE); $stack->push(ERROR_CODE_TWO); $stack->push(ERROR_CODE_THREE); var_dump(PEAR_ErrorStack::staticGetErrors()); // simule PEAR_ERROR_CALLBACK avec des callbacks specifiques pour // monpackage. // Chaque autre package loggera simplemenet l'erreur, // seulement les erreurs mypackage sont poussées sur la pile d'une maniere // conditionnelle class myclass { function acallback($err) { return PEAR_ERRORSTACK_LOG; } } $stack2 = PEAR_ErrorStack::singleton('anotherpackage'); $stack3 = &PEAR_ErrorStack::singleton('thirdpackage'); PEAR_ErrorStack::setDefaultCallback(array('myclass', 'acallback')); ?>]]> </programlisting> </para> <refsect3 id = "core.pear.pear-errorstack.intro.advanced.callback.repackage"> <title>Reconditionner les erreurs d'un package à un autre</title> <para> L'usage le plus évident d'une fonction de callback d'erreurs implique un scénario commun à beaucoup d'applications niveau utilisateur qui emploient des packages système. Si vous écrivez un Système de gestion de contenu (CMS) en utilisant le package PEAR DB, c'est généralement une mauvaise idée d'afficher des erreurs du niveau base de données quand un utilisateur clique sur un lien pour ajouter un message à un forum. PEAR_ErrorStack peut être utilisée pour reconditionner cette erreur comme une erreur propre à votre package. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('MON_PACKAGE_ERROR_DBDOWN',1); require_once 'PEAR/ErrorStack.php'; function repackage($err) { if ($err['package'] == 'DB') { $mystack = &PEAR_ErrorStack::singleton('monpackage'); $mystack->push(MON_PACKAGE_ERROR_DBDOWN, 'error', array('olderror' => $err)); // ignore lerreur DB , // mais la sauve dans lerreur monpackage pour loguer return PEAR_ERRORSTACK_IGNORE; } } ?>]]> </programlisting> </para> </refsect3> <refsect3 id = "core.pear.pear-errorstack.intro.advanced.callback.silence"> <title>Emulation de lopérateur @</title> <para> Une des forces de PEAR_Error difficile a utiliser implique la méthode <link linkend="core.pear.pear.expecterror"><function>PEAR::expectError</function></link>. Il est possible de rendre silencieuses les erreurs régulieres php en utilisant lopérateur @ de la façon suivante : </para> <para> <programlisting role = "php"><![CDATA[ <?php @file_get_contents(); ?>]]> </programlisting> </para> <para> Emuler ce comportement à laide de PEAR_ErrorStack est simple. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('ERROR_CODE_SOMETHING', 1); require_once 'PEAR/ErrorStack.php'; function silence($err) { // ignore toutes les erreurs return PEAR_ERRORSTACK_IGNORE; } $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->pushCallback('silence'); $stack->push(ERROR_CODE_SOMETHING); ?>]]> </programlisting> </para> <para> PEAR_ErrorStack peut passer un cran au dessus et seulement loguer les erreurs ou seulement les placer sur la pile derreurs en utilisant les deux autres constantes. Finalement, des erreurs particulières peuvent être levées et toutes les autres ignorées. </para> <para> <programlisting role = "php"><![CDATA[ <?php define('SOMEPACKAGE_ERROR_THING', 1); require_once 'PEAR/ErrorStack.php'; function silenceSome($err) { if ($err['package'] != 'somepackage') { // ignore toutes les erreurs dautres packages return PEAR_ERROR_IGNORE; } if ($err['code'] != SOMEPACKAGE_ERROR_THING) { // ignore tous les autres codes derreurs return PEAR_ERRORSTACK_IGNORE; } } $stack = &PEAR_ErrorStack::singleton('monpackage'); $stack->pushCallback('silenceSome'); $stack->push(ERROR_CODE_SOMETHING); ?>]]> </programlisting> </para> </refsect3> </refsect2> </refsect1> <refsect1 id = "core.pear.pear-errorstack.intro.merging"> <title> Compatibilité descendante avec PEAR_Error, et ascendante avec les exceptions PHP5 </title> <para> <classname>PEAR_ErrorStack</classname> peut être aussi programmée pour automatiquement générer un objet PEAR_Error utilisant <link linkend="core.pear.pear.raiseerror"><function>PEAR::raiseError</function></link>, il suffit simplement de passer le paramètre Pear_Error compatibility à vrai de la manière suivante : </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage', false, null, 'PEAR_ErrorStack', true); ?>]]> </programlisting> </para> <para> PEAR_ErrorStack retournera une exception automatiquement en PHP5. Vous pouvez fixer le nom de lexception qui sera retournée en utilisant le code suivant : </para> <para> <programlisting role = "php"><![CDATA[ <?php require_once 'PEAR/ErrorStack.php'; $stack = &PEAR_ErrorStack::singleton('monpackage', false, null, 'PEAR_ErrorStack', false, 'MyException'); ?>]]> </programlisting> </para> </refsect1> </refentry> <!-- Generated by phpDocumentor v 1.3.0RC3 http://www.phpdoc.org --> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->