Tratando erros em PHP

Luis Filipe Costa Carvalho

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.

Aprovado!, Desenvolvimento, Interessante, Leu? Comente!, PHP

6 Responses to “Tratando erros em PHP”

  1. VitorGGA Says:
    outubro 17th, 2007 at 15:02

    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

  2. Fill Says:
    outubro 17th, 2007 at 21:33

    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 =)

  3. Leonardo L Procópio Says:
    outubro 19th, 2007 at 18:50

    Show de bola em! vou fazer uns testes pra ver qual é!!

  4. TP Says:
    outubro 23rd, 2007 at 09:29

    Bacana a dica, vou começar a utilizar…..

  5. Lorran Says:
    março 1st, 2008 at 01:47

    Parabéns!
    Interessante essa dica, vou tentar colocá-la em prática!

  6. floripes Says:
    março 4th, 2008 at 22:35

    estou fazendo um php de formulario e apareceu o seguinte erro: if ($ read==”sim” )
    sera que vc sabe?

Leave a Reply

Icons by N.Design Studio. Designed By Ben Swift. Powered by WordPress and Free WordPress Themes
RSS RSS dos Comentários Login