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