Depois que um sistema é produzido ele vai para o ambiente de testes e, nem sempre, todas as possibilidades são testadas e todas as falhas são descobertas. Alguns erros passam daqui, outros dali e o site vai para um ambiente real funcionando 90%. É muito difícil um site sair da produção sem nenhuma falha. Mas ai esta a questão. Se ele der erro em ambiente real, como ficar sabendo?
Provavelmente pensando nisso o pessoal da Zend implementou a função set_error_handler, que serve para tratar erros gerados em tempo de execução.
Por exemplo, se você usar uma variável que não existe ou dividir um número por zero esta função será chamada e você trata o erro da forma que achar melhor.
Nos sites que eu desenvolvo normalmente eu uso esta função para tratar os erros:
set_error_handler('trataErro');
function trataErro($msg,$errno,$errstr,$errfile,$errline) {
$msg ="<pre>
\nErro....: [$errno] - $errstr
\nDate....: ".date("d/m/Y H:i:s") . "
\nFile....: <b>$errfile</b> : <b>$errline</b>\n
</pre>
<h2>Roll Back: </h2$gt;";
$trace = debug_backtrace(); //pegando o backtrace da execução
foreach ($trace as $k=>$v) {
if ($v['function'] == "trataErro") continue;
$msg .= "<ul><li>Função: <b style=\" color: green\">" . $v['function'] . "</b></li></ul>
<ol>File: " . $v['file'] ."</ol>
<ol>Linha: " . $v['line'] ."</ol>";
if (isset($v['args'])) {
$msg .= "Argumentos:<ul>";
foreach ($v['args'] as $a) {
$msg .= "<li>$a</li>";
}
$msg .= "</ul>";
}
}
ob_start(); //ligando buffer de saida
echo "<h1> Variáveis Globais </h1>";
echo "<h2> _SERVER </h2>";
echo "<pre>\n";print_r($_SERVER);echo"</pre>";
echo "<h2> _POST </h2>";
echo "<pre>\n";print_r($_POST);echo"</pre>";
echo "<h2> _GET </h2>";
echo "<pre>\n";print_r($_GET);echo"</pre>";
$msg .= ob_get_contents(); //pegando o conteúdo do buffer de saida
ob_end_clean(); //limpando o buffer de saida
echo $msg;
die; //Se algum erro existir ele aborta a execução do script
}
Depois de gerada a mensagem, se o site estiver em ambiente real ele mostra uma mensagem falando sobre o erro e pedindo desculpas e se estiver em ambiente de teste ele mostra o erro da forma como eu organizei na função.
O uso deste tipo de função é simples e trás grandes ganhos para os programadores que conseguem ter um feedback de como esta o código do site.
Mais rapah, o óraculo do php, sr. Manual tem mais coisa ainda que eu não sabia… :p
Mas falando sobre tratamento de erros, quando lí isso ai já vim pensando, puxaaaaa, posso fazer o código mandar o erro por e-mail, nossaaaaaa
Ai foi que descobri o errorlog, envia o erro direto por e-mail sem precisar nem de mail.
Compensa estudar… isso vai melhorar a sensação de segurança de nossos clientes, certamente, eles ficarão mais felizes :D
Eu soh num sakei como q em ambiente real ele faz alguma coisa e em ambiente de testes ele faz outra :s
Noite Vitor,
é relativamente simples, no PHP nós temos variáveis globais, tipo $_POST, ou $_GET. Neste caso iremos usar a variável $_SERVER.
A $_SERVER é um vetor com várias informações do servidor e ele tem uma posição chamada SERVER_NAME, acessada por $_SERVER['SERVER_NAME']. Você verifica se ela é, seu dominio.com.br e exibe uma mensagem do tipo:
“Ocorreu um erro! Desculpe-nos pelo transtorno”
Se o SERVER_NAME for seudominiointerno.vitor.net você exibe o erro da forma que você quiser =)
Show de bola em! vou fazer uns testes pra ver qual é!!
Bacana a dica, vou começar a utilizar…..
Parabéns!
Interessante essa dica, vou tentar colocá-la em prática!
estou fazendo um php de formulario e apareceu o seguinte erro: if ($ read==”sim” )
sera que vc sabe?
Muito util mesmo amigo =) eu trabalho sempre em “E_ALL” com PHP e este script é muito bom para gerar LOGs dos erros, vou adpata-lo para meu uso, Obrigado por compartilhar
Tem algum exemplo de como deve usar?