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ê:
-
<?php
-
function foobar($nome) {
-
if (strlen($nome) <3)
-
return -1;
-
if (strpos($nome,"foo"))
-
return -2;
-
-
echo $nome;
-
return 0;
-
}
-
?>
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:
-
<?php
-
function foobar($nome) {
-
if (strlen($nome) <3)
-
throw new Exception ("O nome não é válido !");
-
if (strpos($nome,"foo"))
-
throw new Exception("O nome precisa conter foo, cara !");
-
-
echo $nome;
-
}
-
?>
Com isso na sua Action, simplesmente:
-
<?php
-
include "function_foobar.php";
-
try {
-
foobar("ab");
-
} catch (Exception $e) {
-
$var_template_sem_merchan_pro_smarty->assign('retorno_de_erro',$e->getMessage());
-
}
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...
-
<?php
-
function foobar($nome) {
-
if (strlen($nome) <3) {
-
error_log("O cara forneceu ". $nome . " e isto é inválido \n", 3, "seu_arquivo_de_log.txt");
-
throw new Exception ("O nome não é válido !");
-
}
-
if (strpos($nome,"foo")) {
-
error_log("O cara forneceu ". $nome . " porém sem o foo !\n", 3, "seu_arquivo_de_log.txt");
-
// #notamental não há motivos para logar "erros" deste tipo. Estou apenas ilustrando seu funcionamento
-
throw new Exception("O nome precisa conter foo, cara !");
-
}
-
-
echo $nome;
-
}
-
?>
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 .




Bom bom, muito bom
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!
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…
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