<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Exceções</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Referência da Linguagem" HREF="langref.html"><LINK REL="PREVIOUS" TITLE="Indução de Tipo" HREF="language.oop5.typehinting.html"><LINK REL="NEXT" TITLE="Referências" HREF="language.references.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="language.oop5.typehinting.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.references.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="language.exceptions" >Capítulo 20. Exceções</A ></H1 ><DIV CLASS="TOC" ><DL ><DT ><B >Índice</B ></DT ><DT ><A HREF="language.exceptions.html#language.exceptions.extending" >Herdando Exceções</A ></DT ></DL ></DIV ><P > PHP 5 tem um modelo de exceção similar ao de outras linguagens de programação. Uma exceção pode ser disparada (<TT CLASS="literal" >throw</TT >n), ou pega (caught ou "<TT CLASS="literal" >catch</TT >ed") no PHP. Código pode ser rodeado em um block <TT CLASS="literal" >try</TT >, para facilitar a captura de exceções em potencial. Cada bloco <TT CLASS="literal" >try</TT >, deve ter pelo menos um bloco <TT CLASS="literal" >catch</TT > correspondente. Vários blocos <TT CLASS="literal" >catch</TT > pode ser usado para pegar diferentes classes de exceções. A execução normal (quando nenhuma exceção é disparada dentro de um bloco <TT CLASS="literal" >try</TT > ou quando um <TT CLASS="literal" >catch</TT > compatível com a classe da exceção disparada não estiver presente) continuará após o último bloco <TT CLASS="literal" >catch</TT > definido na seqüência. Exceções podem ser disparadas (ou re-disparadas) dentro de um bloco <TT CLASS="literal" >catch</TT >. </P ><P > Quando uma exceção é disparada, código logo após à instrução não será executada, e o PHP tentará achar o primeiro bloco <TT CLASS="literal" >catch</TT > correspondente à exceção disparada. Se uma exceção não for pega, um Erro Fatal do PHP será lançado com uma mensagem "<TT CLASS="literal" >Uncaught Exception ...</TT >", a não ser que um tratador tenha sido definido com <A HREF="function.set-exception-handler.html" ><B CLASS="function" >set_exception_handler()</B ></A >. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6171" ></A ><P ><B >Exemplo 20-1. Disparando uma Exceção</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />try </font><font color="#007700">{<br /> </font><font color="#0000BB">$error </font><font color="#007700">= </font><font color="#DD0000">'Sempre dispara esse erro'</font><font color="#007700">;<br /> </font><font color="#0000BB">throw </font><font color="#007700">new </font><font color="#0000BB">Exception</font><font color="#007700">(</font><font color="#0000BB">$error</font><font color="#007700">);<br /><br /> </font><font color="#FF8000">// Código que segue uma exceção não é executado<br /> </font><font color="#007700">echo </font><font color="#DD0000">'Nunca é executado'</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">Exception $e</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"Exceção pega: "</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">, </font><font color="#DD0000">"\n"</font><font color="#007700">;<br />}<br /><br /></font><font color="#FF8000">/* continua execução */<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.exceptions.extending" >Herdando Exceções</A ></H1 ><P > Uma classe de exceção definida pelo usuário pode ser criada herdando a classe Exception. Os membros e propriedades abaixo mostram o que é acessível a partir da classe filha que deriva da Exception. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6177" ></A ><P ><B >Exemplo 20-2. A classe nativa Exception</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">Exception </font><font color="#007700">{<br /><br /> </font><font color="#0000BB">protected $message </font><font color="#007700">= </font><font color="#DD0000">'Unknown exception'</font><font color="#007700">; </font><font color="#FF8000">// Mensagem da exceção<br /> </font><font color="#0000BB">protected $code </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">; </font><font color="#FF8000">// Código da exceção definido pelo usuário<br /> </font><font color="#0000BB">protected $file</font><font color="#007700">; </font><font color="#FF8000">// Arquivo gerador da exceção<br /> </font><font color="#0000BB">protected $line</font><font color="#007700">; </font><font color="#FF8000">// Linha geradora da exceção<br /><br /> </font><font color="#007700">function </font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">string $message</font><font color="#007700">=</font><font color="#0000BB">NULL</font><font color="#007700">, </font><font color="#0000BB">int code</font><font color="#007700">=</font><font color="#0000BB">0</font><font color="#007700">);<br /><br /> </font><font color="#0000BB">final </font><font color="#007700">function </font><font color="#0000BB">getMessage</font><font color="#007700">(); </font><font color="#FF8000">// Mensagem da exceção<br /> </font><font color="#0000BB">final </font><font color="#007700">function </font><font color="#0000BB">getCode</font><font color="#007700">(); </font><font color="#FF8000">// Código da exceção<br /> </font><font color="#0000BB">final </font><font color="#007700">function </font><font color="#0000BB">getFile</font><font color="#007700">(); </font><font color="#FF8000">// Arquivo gerador<br /> </font><font color="#0000BB">final </font><font color="#007700">function </font><font color="#0000BB">getTrace</font><font color="#007700">(); </font><font color="#FF8000">// um array com o backtrace()<br /> </font><font color="#0000BB">final </font><font color="#007700">function </font><font color="#0000BB">getTraceAsString</font><font color="#007700">(); </font><font color="#FF8000">// String formatada do trace<br /><br /> /* Sobrecarregável */<br /> </font><font color="#007700">function </font><font color="#0000BB">_toString</font><font color="#007700">(); </font><font color="#FF8000">// String formatada para ser mostrada<br /><br /></font><font color="#007700">}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><P > Se uma classe herda da classe Exception e redefine o <A HREF="language.oop5.decon.html" >construtor</A >, é altamente recomendado que o mesmo chame <A HREF="language.oop5.paamayim-nekudotayim.html" >parent::__construct()</A > para garantir que todas as informações disponíveis sejam devidamente atribuídas. O método <A HREF="language.oop5.magic.html" >__toString()</A > pode ser sobrecarregado para permitir uma saída personalizada quando o objeto é apresentado como string. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6184" ></A ><P ><B >Exemplo 20-3. Herdando a classe Exception</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /><br /></font><font color="#007700">class </font><font color="#0000BB">MyException </font><font color="#007700">extends </font><font color="#0000BB">Exception </font><font color="#007700">{<br /><br /> </font><font color="#FF8000">/* Redefine a exceção para que a mensagem não seja opcional */<br /> </font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">$message</font><font color="#007700">, </font><font color="#0000BB">$code </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">) {<br /><br /> </font><font color="#FF8000">// coisas personalizadas que você queira fazer<br /> // ...<br /><br /> /* Garante que tudo é atribuído corretamente */<br /> </font><font color="#0000BB">parent</font><font color="#007700">::</font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">$message</font><font color="#007700">, </font><font color="#0000BB">$code</font><font color="#007700">);<br /> }<br /><br /> </font><font color="#FF8000">/* Representação do objeto personalizada no formato string */<br /> </font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">__toString</font><font color="#007700">() {<br /> return </font><font color="#0000BB">__CLASS__ </font><font color="#007700">. </font><font color="#DD0000">": </font><font color="#007700">[{</font><font color="#DD0000">$this</font><font color="#007700">-></font><font color="#DD0000">code</font><font color="#007700">}]</font><font color="#DD0000">: </font><font color="#007700">{</font><font color="#DD0000">$this</font><font color="#007700">-></font><font color="#DD0000">message</font><font color="#007700">}\n</font><font color="#DD0000">"</font><font color="#007700">;<br /> }<br /><br /> </font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">customFunction</font><font color="#007700">() {<br /> echo </font><font color="#DD0000">"Uma função personalizada para esse tipo de exceção\n"</font><font color="#007700">;<br /> }<br /><br />}<br /><br /></font><font color="#FF8000">/**<br /> * Cria uma classe para testar a exceção<br /> */<br /></font><font color="#007700">class </font><font color="#0000BB">TestException </font><font color="#007700">{<br /><br /> </font><font color="#0000BB">public $var</font><font color="#007700">;<br /><br /> const </font><font color="#0000BB">THROW_NONE </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /> const </font><font color="#0000BB">THROW_CUSTOM </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">;<br /> const </font><font color="#0000BB">THROW_DEFAULT </font><font color="#007700">= </font><font color="#0000BB">2</font><font color="#007700">;<br /><br /><br /> function </font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">$avalue </font><font color="#007700">= </font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">THROW_NONE</font><font color="#007700">) {<br /><br /> switch (</font><font color="#0000BB">$avalue</font><font color="#007700">) {<br /> case </font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">THROW_CUSTOM</font><font color="#007700">:<br /> </font><font color="#FF8000">// dispara exceção personalizada<br /> </font><font color="#0000BB">throw </font><font color="#007700">new </font><font color="#0000BB">MyException</font><font color="#007700">(</font><font color="#DD0000">'1 é um parâmetro inválido'</font><font color="#007700">, </font><font color="#0000BB">5</font><font color="#007700">);<br /> break;<br /><br /> case </font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">THROW_DEFAULT</font><font color="#007700">:<br /> </font><font color="#FF8000">// dispara a padrão<br /> </font><font color="#0000BB">throw </font><font color="#007700">new </font><font color="#0000BB">Exception</font><font color="#007700">(</font><font color="#DD0000">'2 não é permitido como parâmetro'</font><font color="#007700">, </font><font color="#0000BB">6</font><font color="#007700">);<br /><br /> break;<br /><br /> default:<br /> </font><font color="#FF8000">// Nenhuma exceção, objeto será criado.<br /> </font><font color="#0000BB">$this</font><font color="#007700">-></font><font color="#0000BB">var </font><font color="#007700">= </font><font color="#0000BB">$avalue</font><font color="#007700">;<br /> break;<br /><br /> }<br /><br /> }<br /><br />}<br /><br /></font><font color="#FF8000">// Exemplo 1<br /></font><font color="#0000BB">try </font><font color="#007700">{<br /> </font><font color="#0000BB">$o </font><font color="#007700">= new </font><font color="#0000BB">TestException</font><font color="#007700">(</font><font color="#0000BB">TestException</font><font color="#007700">::</font><font color="#0000BB">THROW_CUSTOM</font><font color="#007700">);<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">MyException $e</font><font color="#007700">) { </font><font color="#FF8000">/* Será pega */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Pegou minha exceção\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br /> </font><font color="#0000BB">$e</font><font color="#007700">-></font><font color="#0000BB">customFunction</font><font color="#007700">();<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">Exception $e</font><font color="#007700">) { </font><font color="#FF8000">/* Ignorado */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Pegou Exceção Padrão\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">); </font><font color="#FF8000">/* continua execução */<br /></font><font color="#007700">echo </font><font color="#DD0000">"\n\n"</font><font color="#007700">;<br /><br /><br /></font><font color="#FF8000">// Exemplo 2<br /></font><font color="#0000BB">try </font><font color="#007700">{<br /> </font><font color="#0000BB">$o </font><font color="#007700">= new </font><font color="#0000BB">TestException</font><font color="#007700">(</font><font color="#0000BB">TestException</font><font color="#007700">::</font><font color="#0000BB">THROW_DEFAULT</font><font color="#007700">);<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">MyException $e</font><font color="#007700">) { </font><font color="#FF8000">/* Tipos não batem */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Pegou minha exceção\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br /> </font><font color="#0000BB">$e</font><font color="#007700">-></font><font color="#0000BB">customFunction</font><font color="#007700">();<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">Exception $e</font><font color="#007700">) { </font><font color="#FF8000">/* Será pega */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Pegou Exceção Padrão\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">); </font><font color="#FF8000">/* continua execução */<br /></font><font color="#007700">echo </font><font color="#DD0000">"\n\n"</font><font color="#007700">;<br /><br /><br /></font><font color="#FF8000">// Exemplo 3<br /></font><font color="#0000BB">try </font><font color="#007700">{<br /> </font><font color="#0000BB">$o </font><font color="#007700">= new </font><font color="#0000BB">TestException</font><font color="#007700">(</font><font color="#0000BB">TestException</font><font color="#007700">::</font><font color="#0000BB">THROW_CUSTOM</font><font color="#007700">);<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">Exception $e</font><font color="#007700">) { </font><font color="#FF8000">/* Será pega */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Default Exception caught\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">); </font><font color="#FF8000">/* continua execução */<br /></font><font color="#007700">echo </font><font color="#DD0000">"\n\n"</font><font color="#007700">;<br /><br /><br /></font><font color="#FF8000">// Exemplo 4<br /></font><font color="#0000BB">try </font><font color="#007700">{<br /> </font><font color="#0000BB">$o </font><font color="#007700">= new </font><font color="#0000BB">TestException</font><font color="#007700">();<br />}<br /></font><font color="#0000BB">catch </font><font color="#007700">(</font><font color="#0000BB">Exception $e</font><font color="#007700">) { </font><font color="#FF8000">/* Ignorada, nenhuma exceção */<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Default Exception caught\n"</font><font color="#007700">, </font><font color="#0000BB">$e</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">); </font><font color="#FF8000">/* continua execução */<br /></font><font color="#007700">echo </font><font color="#DD0000">"\n\n"</font><font color="#007700">;</font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="language.oop5.typehinting.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="language.references.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Indução de Tipo</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="langref.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Referências</TD ></TR ></TABLE ></DIV ></BODY ></HTML >