<?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>CrisDev - Cristian Medeiros &#187; exception</title>
	<atom:link href="http://crisdev.eti.br/tag/exception/feed" rel="self" type="application/rss+xml" />
	<link>http://crisdev.eti.br</link>
	<description>Desenvolvedor Web</description>
	<lastBuildDate>Wed, 01 Sep 2010 02:12:25 +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>PHP &#8211; Criando e tratando exceptions</title>
		<link>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html</link>
		<comments>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html#comments</comments>
		<pubDate>Fri, 07 Nov 2008 17:36:24 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=42</guid>
		<description><![CDATA[&#160;
N&#227;o &#233; novidade, mas vale o registro. O PHP 5, possui uma funcionalidade bem interessante, similar a outras linguagens orientadas a objeto, Exce&#231;&#227;o. Quando algo altera o fluxo de execu&#231;&#227;o do sistema ele dispara uma Exce&#231;&#227;o. Uma exce&#231;&#227;o pode ser disparada ou capturada, depende do que voc&#234; pretende. Voc&#234; pode customizar um s&#233;rie de tratamentos [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>N&atilde;o &eacute; novidade, mas vale o registro. O PHP 5, possui uma funcionalidade bem interessante, similar a outras linguagens orientadas a objeto, Exce&ccedil;&atilde;o. Quando algo altera o fluxo de execu&ccedil;&atilde;o do sistema ele dispara uma Exce&ccedil;&atilde;o. Uma exce&ccedil;&atilde;o pode ser disparada ou capturada, depende do que voc&ecirc; pretende. Voc&ecirc; pode customizar um s&eacute;rie de tratamentos de erros que ir&atilde;o facilitar o desenvolvimento do seu sistema, com essa custimiza&ccedil;&atilde;o voc&ecirc; pode saber exatamente o que est&aacute; sendo tratado e se algo fugir desse controle &eacute; algo anormal e fica mais facil a rastreabilidade.</p>
<p>Dentro de uma exce&ccedil;&atilde;o, voc&ecirc; pode disparar um log, ou um alert, ou registrar algo no banco, &eacute; um fluxo de erro sob controle.</p>
<p>Eu costumo tratar as exce&ccedil;&otilde;es para tudo, campo em branco, tipo de dado inv&aacute;lido, e-mail inv&aacute;lido, ou se alguma f&oacute;rmula n&atilde;o foi validada. Para isso uso um conjunto de classes que constituem as mensagens e os testes para que as exce&ccedil;&otilde;es sejam disparadas:</p>
<p>Uma classe Main para controlar as requisi&ccedil;&otilde;es de Exception:</p>
<h2>MainException.php:</h2>
<p>&lt;?PHP <br />
&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; * Declara&ccedil;&atilde;o da classe para tratamento de erros <br />
&nbsp;&nbsp;&nbsp; * A classe deve ser extendida da classe Exception do PHP<br />
&nbsp;&nbsp;&nbsp; * Ela ir&aacute; realizar a sobrescrita da classe Exception do PHP <br />
&nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp; class MainException extends Exception { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Fa&ccedil;o a declara&ccedil;&atilde;o das vari&aacute;vis que vou utilizar no corpo da classe <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $cod&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &quot;&quot;; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $erromsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &quot;&quot;; </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Aqui fa&ccedil;o a declara&ccedil;&atilde;o do m&eacute;todo construtor de classe <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Esse m&eacute;todo recebe os seguintes parametros: <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $cod &#8211; C&oacute;digo de erro <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $msg &#8211; Uma mensagem de erro personalizada <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $erromsg &#8211; Uma mensagem de erro padr&atilde;o<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function __construct( $cod = 0 , $msg = &quot;&quot; , $erromsg = &quot;&quot; ) { <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Sobreescrevo as propiedades da classe passando os parametros <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;cod = $cod; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;msg = &quot;Ocorreu um erro n&atilde;o identificado&quot;; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;erromsg = $erromsg; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Aqui eu chamo o construtor da classe pai&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent::__construct( $this-&gt;msg , $this-&gt;cod );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Este m&eacute;todo ir&aacute; salvar nossos erros em um log <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function _Log() { </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Define o arquivo que ser&aacute; criado ou gravado caso exista, o nome do arquivo ir&aacute; ser o nome da classe<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $log = __CLASS__ . &quot;_log_&quot; . date(&quot;dmY&quot;) . &quot;txt&quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Se n&atilde;o existe arquivo, cria <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( !file_exists($log)){ <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg = &quot;/************************************************** &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * Arquivo de log &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * ClassName: &quot; . __CLASS__ . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * Data Cria&ccedil;&atilde;o: &quot; . date(&quot;d/m/Y H:i&quot;) . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; *************************************************/ &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg = &quot;&quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Abre o arquivo <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($fp = fopen( $txt , &quot;a+&quot;)) { <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Arquivo <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg .=&nbsp;&nbsp;&nbsp; __CLASS__ . &quot; hora: &quot;.date(&quot;H:i&quot;) . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;Erro [ {$this-&gt;cod} ]: linha ( {$this-&gt;line} ) &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;{$this-&gt;msg} &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;{$this-&gt;erromsg} &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Grava <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fwrite($fp, $msg); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fclose($fp); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; } <br />
?&gt;</p>
<p>A classe abaixo estende MainException e a customiza para Exce&ccedil;&otilde;es de texto:</p>
<h2>textException.php:</h2>
<p>&lt;?PHP <br />
/** <br />
&nbsp;* Esta classe &eacute; respons&aacute;vel por disparar exce&ccedil;&otilde;es relacionadas a texto <br />
&nbsp;*/ <br />
&nbsp;class textException extends MainException { <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public function __construct(&nbsp; ) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sobrescrita do construtor de MainException, com os valores que queremos <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent::__construct( 1, &quot;Tipo de caracter inv&aacute;lido&quot;, PHPSELF); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;_Log(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;} <br />
?&gt;</p>
<p>A classe abaixo faz a verifica&ccedil;&atilde;o do texto e dispara a exce&ccedil;&atilde;o:</p>
<h2>verificaTexto.php:</h2>
<p>&lt;?PHP <br />
&nbsp;<br />
class verificaTexto <br />
{ <br />
&nbsp;&nbsp;&nbsp; public function __construct($texto) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!is_int($texto)) <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $texto; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new textException(); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>A classe abaixo faz o teste para n&uacute;meros e caso falhe, dispara MainException, ou seja sem customizar o tipo de exce&ccedil;&atilde;o que ser&aacute; disparada, ent&atilde;o ir&aacute; enviar a mensagem padr&atilde;o:</p>
<h2>verificaValor.php:</h2>
<p>&lt;?PHP <br />
&nbsp;<br />
class verificaValor <br />
{ <br />
&nbsp;&nbsp;&nbsp; public function __construct($val) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($val == 1) <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $val; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new MainException(); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>Apenas para teste:</p>
<p>&lt;?PHP <br />
&nbsp;<br />
include (&quot;autoload.php&quot;); <br />
&nbsp;<br />
try <br />
{ <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; //$b = new verificaTexto(1); <br />
&nbsp;&nbsp;&nbsp; $b1 = new verificaValor(1123); <br />
&nbsp;<br />
} <br />
Catch(textException $te) <br />
{ <br />
&nbsp;&nbsp;&nbsp; echo $te-&gt;getMessage(); <br />
} <br />
catch(Exception $e) <br />
{ <br />
&nbsp;&nbsp;&nbsp; echo $e-&gt;getMessage(); <br />
} <br />
&nbsp;<br />
&nbsp;<br />
?&gt;</p>
<p>E o autoload se algu&eacute;m quiser:</p>
<p>&lt;?PHP <br />
&nbsp;<br />
function __autoload($class_name) { <br />
&nbsp;&nbsp;&nbsp; require_once $class_name . &#8216;.php&#8217;; <br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>Como podem ver, a classe MainException &eacute; que faz todo o trabalho, nela temos o m&eacute;todo principal que realiza o disparo das exceptions, em textException, sobrespcrevemos a classe MainException e fazemos ela se comportar como queremos para disparar apenas uma mensagem de erro para textos.</p>
<p>Ainda existe a possibilidade de disparar uma Exception gen&eacute;rica, caso nosso tratamento n&atilde;o seja para textos. Se observarem com calma ver&atilde;o que se trata apenas de sobrescritas de m&eacute;todos algo que seria perfeitamente poss&iacute;vel sem Exception, por&eacute;m desta forma temos mais controle (fora a elegancia do c&oacute;digo).</p>
<p>Bom &eacute; isso, qualquer d&uacute;vida comentem.</p>
<p>Para saber mais:</p>
<ul>
<li>Exceptions no manual: <a href="http://www.php.net/manual/en/language.exceptions.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/en/language.exceptions.php?referer=');">http://www.php.net/manual/en/language.exceptions.php</a></li>
<li>Classe MainException original de Jos&eacute; Roberto Gomes da Silva: <a href="http://www.plugmasters.com.br/sys/materias/914/1/Exception-com-php" target="_blank" onclick="urchinTracker('/outgoing/www.plugmasters.com.br/sys/materias/914/1/Exception-com-php?referer=');">http://www.plugmasters.com.br/sys/materias/914/1/Exception-com-php</a></li>
</ul>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/exception" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/exception?referer=');">exception</a>, <a href="http://blogblogs.com.br/tag/oo" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/oo?referer=');">oo</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
