Tratamento de exceções do PHP: uma introdução para iniciantes

O PHP possui um controle de exceções muito similar a outras linguagens de programação, fazendo com que o tratamento de exceções seja uma ferramenta muito interessante para os usuários da linguagem. Este artigo trata do controle e tratamento de exceções do PHP utilizando uma linguagem simples voltada para aqueles que não conhecem nada do assunto.

[ Hits: 34.727 ]

Por: EVERTON DA ROSA em 31/03/2011 | Blog: http://everton3x.github.io


TRY/CATCH é melhor que IF/ELSE?



"try/catch" é melhor que "if/else"?

Essa pergunta deixo para você responder, até porque eu entendo que cada situação deve ser analisada como uma situação única. Nem sempre o que é bom em uma situação, o será em outra.

Assim, tomo a liberdade de apresentar duas soluções para um mesmo problema: uma com "try/catch" e outra com "if/else". Você, caro leitor, decida qual é a melhor.

O nosso problema didático consiste na necessidade de testar três variáveis:
  • $string1, que pode estar em branco, porém gerando um aviso sobre estar em branco;
  • $string2, que precisa ter comprimento mínimo de 5 caracteres para que o script continue;
  • $string3, que precisa ser diferente de zero para que o script continue.

No final, se os testes da string 2 e 3 derem errado, deve haver uma mensagem de falha. Além disso, uma mensagem deve ser impressa somente se ocorrer sucesso e outra mensagem deve sempre ser impressa.

Primeiro, vamos utilizar o "if/else":

$success = true;//Necessário para determinar o sucesso ou fracasso do código

//testando $string1
if(strlen($string1) == 0){
    echo '$string1 está em branco!<br />';
}else{
    echo $string1.'<br />';
}

//testando $string2
if(strlen($string2) < 5){
    echo '$string2 não pode ter comprimento menor que 5 caracteres!<br />';
    $success = false;//ops! ocorreu um erro na interpretação do script e ele não pode continuar
    goto erro;//vai para o erro
}else{
    echo $string2.'<br />';
}

//testando $string3
if($string3 == 0){
    echo '$string3 não pode ser zero!<br />';
    $success = false;//ops! ocorreu um erro na interpretação do script e ele não pode continuar
    goto erro;//vai para o erro
}else{
    echo $string3.'<br />';
}

if($success == true){
    echo 'Esta parte do código somente pode ser executada se tudo estiver OK!<br />';
}

erro:
if($success == false){
    echo 'Falha geral';
}
echo 'Esta parte do código sempre deve ser executada!<br />';

Como o código é muito simples, não vou gastar nosso tempo explicando. Por isso, vamos direto ao mesmo problema solucionado com "try/catch";

$string1 = '';
$string2 = '1234';
$string3 = 0;

try{

    try{
        if(strlen($string1) == 0){
            throw new Exception('$string1 está em branco!<br />');
        }else{
            echo $string1.'<br />';
        }
    }catch(Exception $f){
        echo $f->getMessage();
    }

    try{
        if(strlen($string2) < 5){
            throw new Exception('$string2 não pode ter comprimento menor que 5 caracteres!<br />');
        }else{
            echo $string2.'<br />';
        }
    }catch(Exception $g){
        echo $g->getMessage();
        throw new Exception('Falha geral');
    }

    try{
        if($string3 == 0){
            throw new Exception('$string3 não pode ser zero!<br />');
        }else{
            echo $string3.'<br />';
        }
    }catch(Exception $h){
        echo $h->getMessage();
        throw new Exception('Falha geral');
    }
    echo 'Esta parte do código somente pode ser executada se tudo estiver OK!<br />';
}catch(Exception $e){
    $e->getMessage();
}
echo 'Esta parte do código sempre deve ser executada!<br />';

Agora é com você, caro leitor, decida o que é melhor. Apenas recomendo que, sempre que possível, evite gambiarras. O tratamento de exceção do PHP não está ai à toa. Se existe, deve ser usado quando aplicável.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Um exemplo um pouco mais complexo
   3. TRY/CATCH é melhor que IF/ELSE?
   4. Conclusão
Outros artigos deste autor

Relatórios com PHP e XSLT - Conceitos iniciais e utilização básica

Funções da categoria Miscelânea do PHP

Considerações sobre as distribuições

SliTaz: Mini-review desta mini-distribuição Linux

Utilizando endereços personalizados no seu servidor web: passo-a-passo

Leitura recomendada

Apache, PHP, MariaDB e PhpMyAdmin no Fedora 27

Instalando Servidor LAMP no Ubuntu e Derivadas

PHP5 - Criando e utilizando uma classe básica

PHP Orientado a Objetos: Para quem está começando

PHP e suas variáveis (básico)

  
Comentários
[1] Comentário enviado por removido em 03/04/2011 - 23:37h

Veja que é só uma dica:

$login =@ $_REQUEST['login']; // suprime erros de tela

try {
if ( $login ) {
echo 'Ok';
}
else{
throw new Exception('Falhou', 0);
}
catch( Exception $e ) {
echo $e->getMessage();
}
...bla, bla, bla

[2] Comentário enviado por everton3x em 04/04/2011 - 08:08h

Grato ./.ronin!
O símbolo @ suprime a exibição de mensagens de erro do PHP.

[3] Comentário enviado por jmurray em 08/04/2011 - 08:29h

Cara, dar comando GOTO em código php é uma péssima prática de programação. Creio que seria mais conveniente você colocar essa validação em uma classe que trata os dados de login e colocar um flag dizendo se a validação foi bem sucedida.

Sua intenção ditática é bem intencionada, mas creio que você deve dar uma melhorada no seu estilo de programar ! GOTO == spaghetti code

[4] Comentário enviado por everton3x em 08/04/2011 - 11:17h

Caro jmurray:
Concordo com você que GOTO em PHP é péssima idéia, visto que existem formas melhores para substitui-lo. Entretanto:
1º - Como você mesmo disse: é um código didático.
2º - Não utilizo GOTO em meus códigos não-didáticos e mesmo nos didáticos, esta foi a primeira vez, visto que não conhecia este comando.
3º - Obrigado pela crítica.

[5] Comentário enviado por Ragen em 08/04/2011 - 22:03h

@everton3x, vou fazer uma crítica aqui e espero que seja encarada como construtiva.

Quando alguém vai fazer uma introdução Especialmente para iniciantes, o assunto discutido tem que muito bem dominado e conhecido - por que tem coisa pior que influenciar iniciantes a estudar ou fazer coisas pelo método errado/não adotar as boas práticas de programação?

Todavia, toda ação de compartilhar é bastante apreciada e é por conta dela que essa comunidade existe. Fica os parabéns pela iniciativa de produzir o material.

Abraco

[6] Comentário enviado por everton3x em 09/04/2011 - 08:23h

Obrigado pela crítica Ragen, talvez eu tenha "errado a mão" um pouco neste texto. Vou me policiar mais nas próximas vezes.

[7] Comentário enviado por fmpfmp em 11/04/2011 - 13:37h

Interessante, eu praticamente não uso try/catch em PHP. A maior vantagem que eu vejo é quando você tem muitas condições a serem checadas. Então você precisaria de vários if/else onde apenas um try resolveria. Em compensação você não tem controle das condições que estão erradas porque ele pega a primeira que vier e vai direto pro catch.

[8] Comentário enviado por removido em 11/04/2011 - 18:55h

E uso muito try/catch em POO: Setters methods para throws e desvios condicionais e getters methods para try/catchs.

Entretanto ele é muito interessante para controle da saida de erros conhecidos. Eu costumo chamar esse recurso de programação orientada a erros... Mas ele deve ter um outro nome...

[9] Comentário enviado por everton3x em 11/04/2011 - 20:00h

./.ronin:

Que tal colocar uns exemplos pra gente dar uma olhada?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts