+1

Maior Controle de Erros em PHP

criado por Marcelio Leal em 28/04/2004 11:36am
O código da classe está abaixo, irei mostrando e comentando.
<?php
// desativando todos os erros, para que o usuário não os veja.
error_reporting
(0);

//mudando a função que irá gerenciar os erros a partir de agora.
$old_error_handler
= set_error_handler("erros");

/**
 * @return void
 * @param int           $errno          numero do erro
 * @param string        $errmsg         mensagem de erro
 * @param string        $filename       nome do arquivo
 * @param int           $linenum        número da linha
 * @param array         $vars           diversas variáveis do sistema
 * @desc funçao que servirá de callBack
*/

function erros($errno, $errmsg, $filename, $linenum, $vars) {
    $erro
= new Erro($errno, $errmsg, $filename, $linenum, $vars);
}

class Erro
{      
   
var $nErro;
   
var $msgErro;
   
var $nomeArquivo;
   
var $numLinha;
   
var $vars;
       
   
function Erro($nErro,$msgErro,$nomeArquivo,$numLinha, $vars){
        $this
->nErro       = $nErro;
        $this
->msgErro     = $msgErro;
        $this
->nomeArquivo = $nomeArquivo;
        $this
->numLinha    = $numLinha;
        $this
->vars        = $vars;
        $this
->logErro();
        $this
->fluxoNavegacao();
   
}
       
   
/**
     * @return int
     * @desc Retorna o número do erro
     */

   
function getNErro(){
       
return $this->nErro;
   
}
       
   
/**
     * @return String
     * @desc Retorna a mensagem do erro
     */

   
function getMsgErro(){
       
return $this->msgErro;
   
}
       
   
/**
     * @return String
     * @desc Retorna o nome do arquivo
     */

   
function getNomeArquivo(){
       
return $this->nomeArquivo;
   
}
       
   
/**
     * @return int
     * @desc Retorna o número da linha do erro
     */

   
function getNumLinha(){
       
return $this->numLinha;
   
}
       
   
/**
     * @return Array
     * @desc Retorna diversas variáveis do ambiente e programa
     */

   
function getVars(){
       
return $this->vars;
   
}
       
   
/**
     * @return String
     * @desc Retorna o nome do tipo do erro
     */

   
function getDescricaoErro($nErro){
       
// Define uma matriz associativa com as strings dos erros
        $desErro
= array(
                         
1    => "Error",
                         
2    => "Warning",
                         
4    => "Parsing Error",
                         
8    => "Notice",
                         
16   => "Core Error",
                         
32   => "Core Warning",
                         
64   => "Compile Error",
                         
128  => "Compile Warning",
                         
256  => "User Error",
                         
512  => "User Warning",
                         
1024 => "User Notice"
                       
);
       
return $desErro[$nErro];
   
}
       
   
/**
     * @return void
     * @desc Cria a mensagem de Log, chama o método de gravação e envio de email.
     */

   
function logErro(){
        $dt
= date("d-m-Y H:i:s");
        $mensagem
= str_replace("\n","",$this->getMsgErro());
        $msgLog
= "Erro aconteceu no dia $dt.<q>".
                 
"O número do erro é ".$this->getNErro().".<q>".
                 
"O Tipo do Erro é  ".$this->getDescricaoErro($this->getNErro()).".<q>".
                 
"O arquivo que acontece o erro é ".$this->getNomeArquivo().".<q>".
                 
"A linha que acontece o erro é ".$this->getNumLinha().".<q><q>".
                 
"A mensagem do erro é $mensagem.<q><l><q>";

       
// nome do arquivo
        $dirBase
= dirname(__FILE__)."/logErros/";
       
if (!file_exists($dirBase)) {
            clearstatcache
();
            mkdir
($dirBase);
       
}
        $dt1  
= date("dmY");
        $nome
= $dirBase.$dt1.".txt";
        clearstatcache
();
                               
       
// gravando no arquivo de log
        $this
->grava($nome,$msgLog);
               
       
// enviar somente um e-mail de aviso por dia que acontecer algum erro
       
if (!(file_exists($nome))) {
            $this
->enviaEmail($msgLog);
       
}
   
}  

   
/**
     * @return void
     * @param string $nome              Nome do arquivo
     * @param string $msgLog            Mensagem de Log
     * @desc Grava no arquivo o erro gerado
     */

   
function grava($nome,$msgLog){
        $msgLog
= str_replace("<q>","\n",$msgLog);
        $msgLog
= str_replace("<l>","-----------------------------------",$msgLog);
        $id
= fopen($nome, "a");
        fwrite
($id,$msgLog);
   
}

   
/**
     * @return void
     * @param string $msgLog            Mensagem de Log
     * @desc Envia o E-mail.
     */

   
function enviaEmail($msgLog){
        $msgLog
= str_replace("<q>","<br>",$msgLog);
        $msgLog
= str_replace("<l>","",$msgLog);
        mail
("erros@servidor.com.br","Erro no Sistema",$msgLog,"from:....");
   
}
       
   
/**
     * @return void
     * @desc Redireciona o usuário se necessário e possível
     */

   
function fluxoNavegacao(){
       
if ($this->getNErro() == 256) {
            header
("location:erro.php".urlencode("Desculpe, o sistema gerou um erro inesperado e sua operação não foi executada.<br>Este erro foi enviado ao(s) administrador(es) do sistema,em breve será corrigido, se necessário entre em contato com o setor responsável."));
       
}
   
}
}
?>

Comentários:

Mostrando 1 - 7 de 7 comentários
muito bem comentado, confuso em algumas partes, mas nada que um olhar mais profundo não resolva. excelente ideia, classe muito util... valeus! :p
03/05/2004 7:37am (~21 anos atrás)

Marcelio Leal disse:
Rodrigo,

Deve-se considerar que, se acontecer um erro fatal o script é interrompido imediatamente.

Portante erros claros de sintaxe e semântica que estão entre os erros fatais, como a chamada de uma função inexistente, interrompe a execução.

Para este tipo de erro, basta você executar uma vez o seu script pra verificar sua valida de e ou mesmo fazer um debug.

Outra coisa que deve ser clara, é que o título do artigo é "Maior controle de erros", o que é realmente possível implementando e incrementando esta classe, mas em nenhum momento, pelo menos até agora, teremos o controle total dos erros, erros fatais ainda são fatais.

Quem quiser utilizar esta classe baixe do link abaixo:
http://www.phpbrasil.com/scripts/script.php/id/1629

Espero ter respondido sua dúvida.

Att,

Marcelio Leal
29/04/2004 5:06pm (~21 anos atrás)

Sinceridade, testei o seu script aqui e de começo tinha achado muuiiittttooo interessante, mas ele "não trata totalmente os erros", chama uma função inexistente dentro do arquivo que inclui a Classe de erro, ele simplesmente ignora, naum grava nada no log, tem algo a dizer a respeito disso??

--
// arquivo teste.php
// incluindo a classe Erro
//include_once dirname(__FILE__)."/erros.php";

$teste ="Marcelio";
//include_once("marcelio.php");
naumn_existe();
hader("location:http://www.papao.net");
--
29/04/2004 3:11pm (~21 anos atrás)

Marcelio Leal disse:
Concordo com vc, a comunidade PHP está crescendo muito em termos de construção de sistemas, utilização de ferramentas, frameworks, etc...
Um exemplo bacana é a I semana de treinamento de software livre do governo federal, está tendo muita procura do PHP e PHP avançado...

O negócio agora é conseguir adotar o PHP nas instituições.

Uma frase pra se pensar:
"Quem disse que algo interpretado não é mais rápido que algo compilado?"

hehehe

Att,

Marcelio Leal
29/04/2004 11:19am (~21 anos atrás)

Márcel Abreu disse:
Muito bom o artigo, hoje, tecnologia não é nada sem qualidade.

O PHP é excelente para criarmos softs de qualidade, pq ele dá suporte a nossa imaginação, e isso é muito bom.

Obrigado Marcelio.
29/04/2004 7:23am (~21 anos atrás)

Muito bom Marcelio, estava procurando um script assim.

Parabéns,

Fabrício
28/04/2004 2:38pm (~21 anos atrás)

Fala Marcelo,

Cara... Recentemente eu tinha lido no site oficial PHP.net sobre um curso/palestra ou algo do genero que seria realizado e por acaso topei com o site de um dos ministrantes.

Pois bem... La tinha um artigo do tipo: "Voce se considera um Guru/Mago em PHP?", enfim, o artigo tinha as topicalizacoes:

- Reciclacao de codigos
- Programacao com orientacao a objetos/hierarquia e herancas
- Identacao e padronizacao de documentacao
- Tratamento de erros (Seu artigo)
- Abstracao
|- Banco de dados
|- Estruturacao de dados dinamicos (por exemplo relacao cookie/sessao)

Enfim... Se olharmos os primeiros artigos publicados aqui no PHPBrasil e compararmos com os mais recentes veremos como a comunidade evoluiu. E evolui em quase todos os quesitos que as outras tecnologias/empresas de tecnologia presam...

Alguem ainda acha que nao queimaram a lingua quem falava que a comunidade Java estava a milhares de anos luz na frente das outras comunidades de desenvolvimento?

kekeke

Vlw pelo artigo

Abracos,

Ragen
28/04/2004 1:09pm (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)