Exceptions. Pois nem tudo é perfeito

Salve !

Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.

E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar a recordar você:

CODE:
  1. <?php
  2. function foobar($nome) {
  3.      if (strlen($nome) <3)
  4.          return -1;
  5.      if (strpos($nome,"foo"))
  6.          return -2;
  7.  
  8.      echo $nome;
  9.      return 0;
  10. }
  11. ?>

Com isso lá na sua Action você fica fazendo malabarismo para encontrar o erro retornado e gerar a mensagem para o usuário. Não demorará muito para você criar sua tabela de erro:

  • -1 para erros de entrada
  • -2 para erros de máscara
  • -3 para calcúlos errados
  • -4 para usuário não logado
  • -5 ....
  • -7634 ....

Realmente, bem simples assim né ? Só consultar a tabela e mandar bala.

Eu realmente não entendo o motivo de muitos não utilizarem a classe nativa de exceções do PHP. É simples, é funcional e de grátis você não precisa montar sua tabelinha de códigos de erro.

Veja o mesmo código reescrito utilizando a tal classe:

CODE:
  1. <?php
  2. function foobar($nome) {
  3.      if (strlen($nome) <3)
  4.          throw new Exception ("O nome não é válido !");
  5.      if (strpos($nome,"foo"))
  6.         throw new Exception("O nome precisa conter foo, cara !");
  7.  
  8.      echo $nome;
  9. }
  10. ?>

Com isso na sua Action, simplesmente:

CODE:
  1. <?php
  2. include "function_foobar.php";
  3. try {
  4.     foobar("ab");
  5. } catch (Exception $e) {
  6.     $var_template_sem_merchan_pro_smarty->assign('retorno_de_erro',$e->getMessage());
  7. }

Assim, você pode ter 1, 2, 3, n mensagens de erro em n camadas da aplicação sem a necessidade de se preocupar em tratar uma a uma também na Action. Fica ultra-transparente na Action além de economizar seus dedos refazendo coisas que já estavam prontas camadas a dentro.

Nota: Não esqueça disso nunca : jamais lance como exception uma mensagem de erro do PHP. Isso é feio - porque vem em inglês -, você será xingado por 3 gerações futuras de programadores além de permitir que os usuários vejam detalhes sobre sua aplicação.

Como detectar os erros sem lança-los ao usuário ?

Bem simples. Persista-os - eita mania - em arquivos de log. Mas calma, antes de sair criando algo com fopen(), leia isto: o PHP também traz o cara que salva - persiste - erros ! Ah sim, o PHP é excelente eu sei. Voltando ao exemplo...

CODE:
  1. <?php
  2. function foobar($nome) {
  3.      if (strlen($nome) <3) {
  4.          error_log("O cara forneceu ". $nome . " e isto é inválido \n", 3, "seu_arquivo_de_log.txt");
  5.          throw new Exception ("O nome não é válido !");
  6.      }
  7.      if (strpos($nome,"foo")) {
  8.         error_log("O cara forneceu ". $nome . " porém sem o foo !\n", 3, "seu_arquivo_de_log.txt");
  9.         // #notamental não há motivos para logar "erros" deste tipo. Estou apenas ilustrando seu funcionamento :)
  10.        throw new Exception("O nome precisa conter foo, cara !");
  11.     }
  12.    
  13.     echo $nome;
  14. }
  15. ?>

Sim, ele, o error_log() salva o log para ti. E pior, digo, melhor: caso queira ele pode enviar a notificação no seu e-mail. Certo, em boa parte dos casos isto definitivamente não é uma boa ideia. Mas pode ser útil algum dia, penso.

Resumo do dia: use ao máximo as Exceptions e as funções para tratamento de erros do php .



4 comentários para “Exceptions. Pois nem tudo é perfeito”

  1. Cairo Noleto says:

    Bom bom, muito bom :)

  2. Aquele lance da tabelinha de erros é o que anos atrás se chamava de “números mágicos”… funções/métodos que retornam valores que não fazem sentido algum fora da cabeça de quem implementou o código!

    []s!

  3. Olá Hélio!

    Se há uma forma de fazer com que o error_log() envie uma notificação para um email arbitrário obtido através de uma outra função eu acho que já achei uma utilidade para o email de notificação…

  4. Fala Helio,

    Uma dica seria utilizar a função set_error_handler do PHP (http://www.php.net/manual/pt_BR/function.set-error-handler.php) e através de uma terceira função – definida nessa anterior – fazer log do erro, envio de email/twitter para o desenvolvedor e depois fazer o throw da exceção.

    abraço

Comente !

Get Adobe Flash playerPlugin by wpburn.com wordpress themes