<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CoolCoyote.net &#187; exceptions</title>
	<atom:link href="http://www.coolcoyote.net/tag/exceptions/feed" rel="self" type="application/rss+xml" />
	<link>http://www.coolcoyote.net</link>
	<description>Coding - Linux</description>
	<lastBuildDate>Sun, 07 Nov 2010 15:27:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dépendances et exceptions</title>
		<link>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions</link>
		<comments>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions#comments</comments>
		<pubDate>Sat, 09 Jan 2010 11:14:47 +0000</pubDate>
		<dc:creator>Denis S.</dc:creator>
				<category><![CDATA[PHP - MySQL]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[dépendance]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.coolcoyote.net/?p=218</guid>
		<description><![CDATA[A l&#8217;heure où j&#8217;entends beaucoup parler d&#8217;objet, de framework, de dépendance faible, d&#8217;injection de dépendance etc. je me suis posé une question. Admettons que dans mon petit framework sans prétention j&#8217;ai envie que mes modules soient complètement indépendants, c&#8217;est-à-dire que je puisse les prendre un à un et les utiliser avec un projet complètement différent, [...]]]></description>
			<content:encoded><![CDATA[<p>A l&#8217;heure où j&#8217;entends beaucoup parler d&#8217;<strong>objet</strong>, de <strong>framework</strong>, de <strong>dépendance faible</strong>, <strong>d&#8217;injection de dépendance</strong> etc. je me suis posé une question. Admettons que dans mon petit framework sans prétention j&#8217;ai envie que mes modules soient complètement indépendants, c&#8217;est-à-dire que je puisse les prendre un à un et les utiliser avec un projet complètement différent, hors framework. <strong>Zend Framework</strong> fait cela. Cependant je me suis demandé comment gérer des exceptions personnalisées dans ce cas ?</p>
<p>En effet, dans mon framework, j&#8217;ai créé une classe d&#8217;exception qui hérite de <em>Exception </em>et qui rajoute des fonctionnalités comme par exemple une méthode permettant d&#8217;afficher le message d&#8217;erreur bien formaté en HTML avec un fond rouge et presque un gyrophare sur le dessus. Oui mais voilà, quand dans un de mes modules j&#8217;ai besoin d&#8217;utiliser une exception et que j&#8217;ai à afficher le message en utilisant une méthode personnalisée de mon exception, cela casse complètement l&#8217;indépendance de mon module. Je ne peux plus le sortir de son contexte car il dépend désormais de la classe d&#8217;exception de mon framework ce qui est contraire à ce que je veux.</p>
<p><span id="more-218"></span></p>
<p>J&#8217;ai vu que Zend Framework crée une classe d&#8217;exception spécifique pour son module héritée de la classe d&#8217;exception du framework, ce qui lui rend à peu près son indépendance puisqu&#8217;en changeant simplement la classe parent, on peut hériter directement de la classe <em>Exception</em>.</p>
<p>Par exemple pour le module de cache, on trouve cette classe d&#8217;exception:<br />
<code lang="php" escaped="true">&lt;?php<br />
class Zend_Cache_Exception extends Zend_Exception {}<br />
?&gt;</code><br />
En changeant la classe parent on rend le module indépendant:<br />
<code lang="php" escaped="true">&lt;?php<br />
class Zend_Cache_Exception extends Exception {}<br />
?&gt;</code><br />
Oui mais voilà, dans ce cas<em> Zend_Exception</em> qui hérite directement de <em>Exception </em>n&#8217;apporte rien de nouveau. Aucune nouvelle méthode, aucune fonctionnalité. Or dans mon cas, si j&#8217;utilise cette façon de procéder les méthodes personnalisées de ma classes d&#8217;exception ne seront plus disponibles lorsque je changerai la classe parent par <em>Exception</em>. Une seule conclusion m&#8217;est venue à l&#8217;esprit: je ne doit pas utiliser les fonctionnalités spéciales de ma classe d&#8217;exception dans mes modules. Dommage, car j&#8217;ai besoin d&#8217;afficher mes messages d&#8217;erreurs comme je le veux&#8230;</p>
<p>Et puis je me suis demandé si c&#8217;était vraiment le rôle de mon module de stopper l&#8217;exécution du programme pour afficher le message d&#8217;erreur. Non finalement. Si je prends pour exemple l&#8217;extension <strong>mysqli </strong>de PHP, elle ne bloque pas l&#8217;exécution du programme si la connexion à la base ne se fait pas. Elle se contente de fournir des méthodes pour récupérer les erreurs. C&#8217;est dans cette direction que je vais aller.</p>
<p>Tout d&#8217;abord, voici une structure de classe pour mon module avec un exemple d&#8217;exception :<br />
<code lang="php" escaped="true">&lt;?php<br />
class MonModule<br />
{<br />
    private $_error = NULL;</p>
<p>    public function __construct()<br />
    {<br />
        try {<br />
            if (!condition) {<br />
                throw new Exception('Message d\'erreur');<br />
            }</p>
<p>            // Suite du code exécuté<br />
        } catch (Exception $e) {<br />
            $this-&gt;_error = $e-&gt;getMessage();<br />
        }<br />
    }</p>
<p>    public function getError()<br />
    {<br />
        return $this-&gt;_error;<br />
    }<br />
}<br />
?&gt;</code><br />
Dans ce code on voir donc que mon module n&#8217;affiche pas le message d&#8217;erreur. Il se contente de le passer à un membre. Dans mon contrôleur, je vais pouvoir faire entrer ma classe d&#8217;exception personnalisée en action:<br />
<code lang="php" escaped="true">&lt;?php<br />
try {<br />
    $instance = new MonModule();</p>
<p>    if ($instance-&gt;getError()) {<br />
        throw new MyException($instance-&gt;getError());<br />
    }<br />
} catch (MyException $e) {<br />
    $e-&gt;methodePerso();<br />
}<br />
?&gt;</code><br />
Ici on travaille directement sur l&#8217;instanciation de la classe <strong>MonModule()</strong>, du coup la valeur retournée par le constructeur est forcément une instance, mais lors de l&#8217;utilisation de cette technique sur les méthodes de la classe, on peut améliorer la chose en retournant <em>false </em>:<br />
<code lang="php" escaped="true">&lt;?php<br />
class MonModule<br />
{<br />
    private $_error = NULL;</p>
<p>    public function maMethode()<br />
    {<br />
        try {<br />
            if (!condition) {<br />
                throw new Exception('Message d\'erreur');<br />
            }</p>
<p>            // Suite du code exécuté<br />
            return $this;<br />
        } catch (Exception $e) {<br />
            $this-&gt;_error = $e-&gt;getMessage();<br />
            return false;<br />
        }<br />
    }</p>
<p>    public function getError()<br />
    {<br />
        return $this-&gt;_error;<br />
    }<br />
}<br />
?&gt;</code><br />
Et dans le contrôleur :<br />
<code lang="php" escaped="true">&lt;?php<br />
try {<br />
    $instance = new MonModule();</p>
<p>    if (!$instance-&gt;maMethode()) {<br />
        throw new MyException($instance-&gt;getError());<br />
    }<br />
} catch (MyException $e) {<br />
    $e-&gt;methodePerso();<br />
}<br />
?&gt;</code><br />
Je ne sais pas si c&#8217;est la méthode idéale, mais au moins je suis sûr de conserver l&#8217;indépendance de mes classes et de mes exceptions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

