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.
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.
[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.
[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...