<?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>PHPBSD.net &#187; error-handler</title>
	<atom:link href="http://www.phpbsd.net/tag/error-handler/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpbsd.net</link>
	<description>Blogueando sobre PHP, BSD, SEO, AJAX, Seguridad, Rendimiento... y mucho más</description>
	<lastBuildDate>Thu, 07 Oct 2010 11:57:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Capturando los fatal errors del PHP con nuestro handler</title>
		<link>http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/</link>
		<comments>http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/#comments</comments>
		<pubDate>Sun, 14 Jan 2007 17:18:34 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[error-handler]]></category>
		<category><![CDATA[fatal-error]]></category>
		<category><![CDATA[output-buffer]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/</guid>
		<description><![CDATA[Tal como comentaba en el post anterior voy a explicar como capturar los fatal errors del PHP para poder tratarlos en la medida de lo posible. Según este mensaje de la lista de desarrollo del PHP (fijaros en los autores) los fatal errors nunca podrán ser capturados en el userland, por ejemplo con un handler [...]


Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/' rel='bookmark' title='Permanent Link: Un error handler que lance exceptions en PHP'>Un error handler que lance exceptions en PHP</a></li><li><a href='http://www.phpbsd.net/2007/05/16/cache-de-paginas-estaticas-para-php/' rel='bookmark' title='Permanent Link: Cache de páginas estáticas para PHP'>Cache de páginas estáticas para PHP</a></li><li><a href='http://www.phpbsd.net/2007/02/09/leyendo-xml-desde-php-con-simplexml/' rel='bookmark' title='Permanent Link: Leyendo XML desde PHP con SimpleXML'>Leyendo XML desde PHP con SimpleXML</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>Tal como comentaba en el post anterior voy a explicar como capturar los fatal errors del PHP para poder tratarlos en la medida de lo posible. Según este <a title="'Re: [PHP-DEV] set_error_handler() and fatal errors?' - MARC" target="_blank" href="http://marc.theaimsgroup.com/?l=php-dev&#038;m=97673386418430&#038;w=2">mensaje de la lista de desarrollo del PHP</a> (fijaros en los autores) los fatal errors nunca podrán ser capturados en el userland, por ejemplo con un handler de errores personalizado, ya que en estos casos el intérprete es probable que quede en un estado inestable y es necesario de una terminación rápida y limpia.</p>
<p>Podemos conseguir un buen comportamiento ante los fatal error configurando adecuadamente las directivas implicadas. Sólo editando el php.ini podemos conseguir que se muestre un mensaje personalizado por pantalla, que se guarde en archivo o no, etc. Para más detalles podéis consultar <a title="PHP: Error Handling and Logging Functions - Manual" target="_blank" href="http://es2.php.net/manual/en/ref.errorfunc.php">el capítulo sobre el tema</a> en el manual del PHP. Lo que aquí se describe es una forma alternativa que nos permite tenerlo controlado desde nuestro código PHP. Como requisitos hemos de tener configurado el PHP para que nos muestre errores por pantalla mediante la directiva de configuración <em>display_errors</em>.</p>
<p>La idea es sencilla, se trata de capturar todo el output buffer de nuestra aplicación y antes de enviarlo al usuario parsearlo en busca de la palabra "error" en negrita seguida de dos puntos con un mensaje y un salto de línea. El fallo es que, lógicamente, si nosotros sacamos por pantalla un string que cumpla lo anterior lo detectaremos como un fatal error del intérprete... aunque es muy difícil que tengamos una cadena de texto que cumpla estas condiciones a no ser que sean errores de nuestra aplicación, en ese caso siempre les podemos cambiar el texto o también podemos configurar la directiva <em>error_prepend_string</em> con una key identificable y modificar el código aquí incluido.</p>
<p>El código es el siguiente:</p>
<div class="syntax_hilite">
<div id="php-3">
<div class="php"><span style="color:#000000; font-weight:bold;">function</span> fatal_error_handler<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$buffer</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/ereg"><span style="color:#000066;">ereg</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"(error&lt;/b&gt;:)(.+)(&lt;br)"</span>, <span style="color:#0000FF;">$buffer</span>, <span style="color:#0000FF;">$regs</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF;">$err</span> = <a href="http://www.php.net/preg_replace"><span style="color:#000066;">preg_replace</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"/&lt;.*?&gt;/"</span>,<span style="color:#FF0000;">""</span>,<span style="color:#0000FF;">$regs</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC66CC;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; <a href="http://www.php.net/error_log"><span style="color:#000066;">error_log</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$err</span>,<span style="color:#CC66CC;">1</span>,<span style="color:#FF0000;">'tu.email@de.alertas.com'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color:#616100;">return</span> <span style="color:#FF0000;">'Mensaje de error personalizado para el usuario'</span>;<br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; <span style="color:#616100;">return</span> <span style="color:#0000FF;">$buffer</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
<a href="http://www.php.net/ob_start"><span style="color:#000066;">ob_start</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"fatal_error_handler"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
funcion_que_no_existe<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<a href="http://www.php.net/ob_end_flush"><span style="color:#000066;">ob_end_flush</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Entre lo aquí descrito y el handler de errores detallado en el post anterior deberíamos tener cualquier error del PHP bajo control. Existen otros errores que no vamos a poder controlar nunca como son todos los errores de sintaxis que provocan <em>parse errors</em>, por ejemplo que falte un ";", estos normalmente se detectan en la etapa de desarrollo y no se espera que sucedan en producción... y si suceden sólo nos queda tener correctamente configuradas las directivas pertinentes del PHP.</p>


<p>Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/' rel='bookmark' title='Permanent Link: Un error handler que lance exceptions en PHP'>Un error handler que lance exceptions en PHP</a></li><li><a href='http://www.phpbsd.net/2007/05/16/cache-de-paginas-estaticas-para-php/' rel='bookmark' title='Permanent Link: Cache de páginas estáticas para PHP'>Cache de páginas estáticas para PHP</a></li><li><a href='http://www.phpbsd.net/2007/02/09/leyendo-xml-desde-php-con-simplexml/' rel='bookmark' title='Permanent Link: Leyendo XML desde PHP con SimpleXML'>Leyendo XML desde PHP con SimpleXML</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un error handler que lance exceptions en PHP</title>
		<link>http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/</link>
		<comments>http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/#comments</comments>
		<pubDate>Sat, 13 Jan 2007 17:43:41 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[error-handler]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/</guid>
		<description><![CDATA[Para conseguir que los errores de PHP lancen exceptions en lugar del clásico mensaje por pantalla y/o entrada en el log, dependiendo de las directivas de configuración usadas, es necesario redefinir el handler de errores del intérprete. Esto es muy útil si estamos programando con PHP5 una aplicación orientada a objetos usando excepciones personalizadas para [...]


Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/' rel='bookmark' title='Permanent Link: Capturando los fatal errors del PHP con nuestro handler'>Capturando los fatal errors del PHP con nuestro handler</a></li><li><a href='http://www.phpbsd.net/2009/04/02/interesantes-usos-y-alternativas-de-__tostring-en-php-5x/' rel='bookmark' title='Permanent Link: Interesantes usos y alternativas de __toString() en PHP 5.x'>Interesantes usos y alternativas de __toString() en PHP 5.x</a></li><li><a href='http://www.phpbsd.net/2007/04/25/carga-automatica-de-clases-en-php-con-autoload/' rel='bookmark' title='Permanent Link: Carga automática de clases en PHP con autoload'>Carga automática de clases en PHP con autoload</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>Para conseguir que los errores de PHP lancen exceptions en lugar del clásico mensaje por pantalla y/o entrada en el log, dependiendo de las directivas de configuración usadas, es necesario redefinir el handler de errores del intérprete. Esto es muy útil si estamos programando con PHP5 una aplicación orientada a objetos usando excepciones personalizadas para tratar los errores de nuestro código. En esta situación sólo nos falta capturar los errores del PHP y convertirlos en excepciones para conseguir tratar de la misma forma cualquier error que se produzca ya sea de nuestro código o del intérprete.</p>
<p>El código necesario es el siguiente:</p>
<div class="syntax_hilite">
<div id="php-7">
<div class="php"><span style="color:#000000; font-weight:bold;">class</span> MyException extends Exception <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; public <span style="color:#0000FF;">$file</span>;<br />
&nbsp; public <span style="color:#0000FF;">$line</span>;<br />
&nbsp; public <span style="color:#000000; font-weight:bold;">function</span> errorHandler<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$errno</span>, <span style="color:#0000FF;">$errstr</span>, <span style="color:#0000FF;">$errfile</span>, <span style="color:#0000FF;">$errline</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF;">$e</span> = <span style="color:#000000; font-weight:bold;">new</span> self<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">message</span> = <span style="color:#0000FF;">$errstr</span>;<br />
&nbsp; &nbsp; <span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">code</span> = <span style="color:#0000FF;">$errno</span>;<br />
&nbsp; &nbsp; <span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">file</span> = <span style="color:#0000FF;">$errfile</span>;<br />
&nbsp; &nbsp; <span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">line</span> = <span style="color:#0000FF;">$errline</span>;<br />
&nbsp; &nbsp; throw <span style="color:#0000FF;">$e</span>;<br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
<a href="http://www.php.net/set_error_handler"><span style="color:#000066;">set_error_handler</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'MyException'</span>, <span style="color:#FF0000;">'errorHandler'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#000000; font-weight:bold;">E_ALL</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Si ya dispones de una clase exception personalizada puedes simplemente añadirle el método <em>errorHandler</em> y lanzar una de tus excepciones ante un error del PHP. Es necesario colocar este código antes de que haya empezado la ejecución de tu aplicación, una buena técnica es crear un script y hacer que la directiva <em>auto_prepend_file</em> apunte a su ubicación... en general yo encuentro cómodo redefinir todos los handlers necesarios en el <em>auto_prepend_file</em> (por ejemplo nuestros handlers de sesiones, errores y excepciones).</p>
<p>Tener en cuenta que en el anterior código PHP fijo el nivel de errores a E_ALL, esto provoca que se lancen exceptions con los E_NOTICE. Si para ti es demasiado que se lance una excepción porque no has inicializado una variable puedes sustituir la línea con la llamada a <em>set_error_handler</em> por:</p>
<div class="syntax_hilite">
<div id="php-8">
<div class="php"><a href="http://www.php.net/set_error_handler"><span style="color:#000066;">set_error_handler</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'MyException'</span>, <span style="color:#FF0000;">'errorHandler'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#000000; font-weight:bold;">E_ALL</span> ^ <span style="color:#000000; font-weight:bold;">E_NOTICE</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Puedes consultar más información acerca de los niveles de error del PHP en la documentación de la función <a target="_blank" title="PHP: error_reporting - Manual" href="http://phpbuilder.com/manual/en/function.error-reporting.php">error_reporting</a>, también puedes pegarle un vistazo al post <a target="_blank" title="Syntax Error :: Artículos y HowTo's de programación, informática y tecnología: PHP, SQL, HTML, Javascript, CSS  » Controlar el Script PHP: set_time_limit, memory_limit y error_reporting" href="http://www.syntaxerror.es/2006/11/23/controlar-el-script-php-set_time_limit-memory_limit-y-error_reporting/">Controlar el Script PHP: set_time_limit, memory_limit y error_reporting</a> publicado en <a target="_blank" title="Syntax Error :: Artículos y HowTo's de programación, informática y tecnología: PHP, SQL, HTML, Javascript, CSS" href="http://www.syntaxerror.es/">SyntaxError.es</a>, un blog amigo dentro de la red <a target="_blank" title="SmallSquid.com » Empresa especializada en publicidad contextual a traves de blogs y portales" href="http://www.smallsquid.com/">SmallSquid.com</a>. Es interesante también consultar la documentación de <a target="_blank" title="PHP: set_error_handler - Manual" href="http://phpbuilder.com/manual/en/function.set-error-handler.php">set_error_handler</a> para más información acerca de los handlers de errores.</p>
<p>Podéis comprobar que el handler funciona con el siguiente código de test:</p>
<div class="syntax_hilite">
<div id="php-9">
<div class="php">try <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <span style="color:#0000FF;">$a</span> + <span style="color:#CC66CC;">2</span>;<br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'aquí no llegamos ya que $a no está inicializada'</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span> catch <span style="color:#006600; font-weight:bold;">&#40;</span>Exception <span style="color:#0000FF;">$e</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Excepción capturada! '</span>.<span style="color:#FF0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>;<br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Code: '</span>.<span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">getCode</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>;<br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Message: '</span>.<span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">getMessage</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>;<br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'Line: '</span>.<span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">getLine</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>;<br />
&nbsp; <a href="http://www.php.net/print"><span style="color:#000066;">print</span></a> <span style="color:#FF0000;">'File: '</span>.<span style="color:#0000FF;">$e</span>-&gt;<span style="color:#006600;">getFile</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#FF0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>A pesar de redefinir el handler de errores los fatal errors nunca podrán ser capturados mediante nuestro error handler ya que el intérprete se queda en un estado inestable y necesita de una terminación rápida y limpia. En un siguiente post explicaré como tratar estos casos.</p>


<p>Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/14/capturando-los-fatal-errors-del-php-con-nuestro-handler/' rel='bookmark' title='Permanent Link: Capturando los fatal errors del PHP con nuestro handler'>Capturando los fatal errors del PHP con nuestro handler</a></li><li><a href='http://www.phpbsd.net/2009/04/02/interesantes-usos-y-alternativas-de-__tostring-en-php-5x/' rel='bookmark' title='Permanent Link: Interesantes usos y alternativas de __toString() en PHP 5.x'>Interesantes usos y alternativas de __toString() en PHP 5.x</a></li><li><a href='http://www.phpbsd.net/2007/04/25/carga-automatica-de-clases-en-php-con-autoload/' rel='bookmark' title='Permanent Link: Carga automática de clases en PHP con autoload'>Carga automática de clases en PHP con autoload</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2007/01/13/un-error-handler-que-lance-exceptions-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

