Maior Controle de Erros em PHP
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.")); } } } ?>
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
(~20 anos atrás)
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
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
(~20 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");
--
--
// 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
(~20 anos atrás)
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
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
(~20 anos atrás)
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.
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
(~20 anos atrás)
Muito bom Marcelio, estava procurando um script assim.
Parabéns,
Fabrício
Parabéns,
Fabrício
28/04/2004 2:38pm
(~20 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
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
(~20 anos atrás)