Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Detonador PHP

Criar controle de Erros

Recommended Posts

Olá. Gostaria de saber o seguinte:

Crio sistemas web em php, e tenho vontade de construir um controle de erros. Qual seria a ideia?

Vamos supor que eu erre alguma consulta SQL, ou qualquer outra coisa que me gere um warning. Teria como ao invez de passar o warning para o usuário, retornar para ele uma página de erro, e o erro ser encaminhado pra mim por e-mail?

 

Outra coisa. Tem como eu numerar ou cadastrar os tipos de erros. Por exemplo: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result ... Dai toda vez que isso acontecer, ao invés de retornar este erro pro usuário, aparece assim na tela dele:

 

O sistema encontrou um erro em sua execução.

O administrador já foi contatado. Para maiores informações bla bla bla...

 

E no meu e-mail aparecer:

O sistema do cliente Tal encontrou um erro (15)

 

Onde este 15 seria o erro Warning: mysql_num_rows(): supplied argument ...

Como se eu criasse uma central de erros.

 

Sugestões!??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca implementei dessa forma, mas ja vi por ai, o povo fazendo com controle de exceptions.

 

Seria com os blocos TRY e CATCH.

Atualmente, eu salvo um log caso ocorra algum erro na consulta, e mando pra esse log, a string SQL que falhou.

Mas oque você pediu, me pareceu um pouco mais avancado que isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usa error_handlers pra isso.Veja a função set_error_handler.

Seguinte...eu básicamente seto o display_errors off e logo os erros (as vezes nem isso,só erro em produção) e trato 'erros com exceções'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Gostaria de saber o seguinte:

Crio sistemas web em php, e tenho vontade de construir um controle de erros. Qual seria a ideia?

Vamos supor que eu erre alguma consulta SQL, ou qualquer outra coisa que me gere um warning. Teria como ao invez de passar o warning para o usuário, retornar para ele uma página de erro, e o erro ser encaminhado pra mim por e-mail?

 

Outra coisa. Tem como eu numerar ou cadastrar os tipos de erros. Por exemplo: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result ... Dai toda vez que isso acontecer, ao invés de retornar este erro pro usuário, aparece assim na tela dele:

 

O sistema encontrou um erro em sua execução.

O administrador já foi contatado. Para maiores informações bla bla bla...

 

E no meu e-mail aparecer:

O sistema do cliente Tal encontrou um erro (15)

 

Onde este 15 seria o erro Warning: mysql_num_rows(): supplied argument ...

Como se eu criasse uma central de erros.

 

Sugestões!??

 

Bom, isso é bem simples. Você irá precisar de alguns caras:

 

1. error_reporting - Esse cara irá definir quais os error serão mostrados ou não

2. set_error_handler - Esse cara será usado para definir uma função que será chamada sempre que um E_ERROR, E_NOTICE, E_WARNING ou qualquer um que você tenha definido no error_reporting.

3. set_exception_handler - Esse cara será usado para definir uma função que será chamada sempre que uma exceção ocorrer e você não pegá-la com catch

4. ob_start- Para impedir que os erros sejam exibidos, buferizando toda a saída.

5. ob_end_flush/ob_end_clean - Para enviar ou limpar a saída buferizada.

 

Depois de montar o controle de erros você só precisará da função mail para enviar os emails.

 

De uma olhada também em:

Error Handling and Logging

Book Output Control

Compartilhar este post


Link para o post
Compartilhar em outros sites

2. set_error_handler - Esse cara será usado para definir uma função que será chamada sempre que um E_ERROR, E_NOTICE, E_WARNING ou qualquer um que você tenha definido no error_reporting.

 

Errado...captura qualquer erro capturavel independente do error_reporting.

No caso creio que só a função que citei é suficiente,mas é sempre bom dar uma estudada.

Você também poderia evitar os erros de serem imprimidos na tela usando output_buferring,mas isso não os impediria de chegar no error_handler padrão do PHP,o que é possivel com um error_handler.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Errado...captura qualquer erro capturavel independente do error_reporting.

 

De fato, eu me expressei mal, o set_error_handler irá capturar qualquer erro, independente do error_reporting.

 

No caso creio que só a função que citei é suficiente,mas é sempre bom dar uma estudada.

Você também poderia evitar os erros de serem imprimidos na tela usando output_buferring,mas isso não os impediria de chegar no error_handler padrão do PHP,o que é possivel com um error_handler.

 

A saída buferizada não é para impedir que o erro seja enviado para o navegador e sim para enviar um erro amigável:

 

/**
 * Definimos o tratador de erros para a função trata_erro
 */
set_error_handler( "trata_erro" );

/**
 * Envia a mensagem de erro por email
 * @param string $errmsg A mensagem de erro
 * @return boolean TRUE se a mensagem tiver sido enviada com sucesso
 */
function envia_email_erro( $errmsg ){
    $to            = "seuemail@dominio.com";
    $from        = "seuemail@dominio.com";
    $subject    = "Erro no sistema";
    $headers    = sprintf( "From: %s\r\nReply-To: %s\r\nX-Mailer: PHP/%s\r\n\r\n" , $from , $from , phpversion() );

    /**
     * Enviamos o email
     */
    $ret = mail( $to , $subject , $errmsg , $headers );

    return( $ret );
}

/**
 * Trata os erros
 * @param integer $errno O nível do erro
 * @param string $error A mensagem de erro
 * @param string $file O arquivo que ocorreu o erro
 * @param integer $line A linha onde o erro ocorreu
 * @param array $context O contexto quando o erro ocorreu
 */
function trata_erro( $errno , $error , $file , $line , $context ){
    $msg = "Erro......: %d\r\nMensagem..: %s\r\nArquivo...: %s\r\nLinha.....: %d\r\nContexto..: %s\r\n";

    envia_email_erro( sprintf( $msg , $errno , $error , $file , $line , print_r( $context , true ) ) );

    /**
     * Limpamos qualquer coisa que tenha sido enviado para o navegador para podermos enviar apenas nossa tela de erro amigável
     */
    ob_end_clean();
    erro_amigavel();
    die; //Matamos a execução da aplicação
}

/**
 * Exibe uma mensagem de erro amigável
 */
function erro_amigavel(){
    printf( "<div class='error'><span class='message'>Lamentamos mas ocorreu um erro no sistema.</span></div>" );
}

ob_start(); // Inicia a saída buferizada
var_dump( $abc ); //A variável $abc não está definida, isso causará um erro
ob_end_flush(); //Enviamos a saída para o navegador se não ocorrer nenhum erro

Isso deverá mostrar o seguinte:

 

<div class='error'><span class='message'>Lamentamos mas ocorreu um erro no sistema.</span></div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato, eu me expressei mal, o set_error_handler irá capturar qualquer erro, independente do error_reporting.

 

Qualquer erro capturavel...xP.

---

Sim eu uso output buffering no tratamento das tais exceções.Não faço tratamento de erros na minha aplicação,e se faço não desse jeito,mas é até interessante.

---

return como função...e die como estrutura de linguagem...que beleza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas!

Eu utilizo tratamento de erros no meu sistema para acompanhar a utilização do sistema.

Eu uso funcoes e cada erro tem um código. e as salvo num banco de dados.

Já peguei muitos ataques pela URL...

 

Mas ai? "error_reporting" vai executar qq coisa mesmo que seja uma parada crítica na execução do código?? mesmo um mail()??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas!

Eu utilizo tratamento de erros no meu sistema para acompanhar a utilização do sistema.

Eu uso funcoes e cada erro tem um código. e as salvo num banco de dados.

Já peguei muitos ataques pela URL...

 

Mas ai? "error_reporting" vai executar qq coisa mesmo que seja uma parada crítica na execução do código?? mesmo um mail()??

 

O error_reporting não, porém o set_error_handler e o set_exception_handler definem uma função que será chamada em caso de erro, dessa forma, você poderá sim salvar em um banco de dados ou tomar qualquer ação que for conveniente para a execução da sua aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dae galera, num sistema orientado a objetos, tb uso funcoes desse jeito ai ou tem outro jeito?

 

e eu encontrei outra coisa, tem um array que as vezes nao tem aquele indice mesmo mais na maioria das vezes possui, e agora usando essa sistematica q foi passada ali ele trava toda hora, como eu faria pra evitar de parar ou sei la tratar direito esse erro?

 

 

 

vlwww e flww

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
class exemplo
{
   public function handleError1($number, $string, $file, $line)
   {
       echo __METHOD__, ' - ', $string, nl2br("\n");
       return true;
   }

   public static function handleError2($number, $string, $file, $line)
   {
       echo __METHOD__, ' - ', $string, nl2br("\n");
       return true;
   }
}

$ex = new exemplo;
set_error_handler(array($ex, 'handleError1'));
trigger_error('Erro 1', E_USER_ERROR);
set_error_handler('exemplo::handleError2');
trigger_error('Erro 2', E_USER_ERROR);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.