Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Bloghost
» Início » Programação » PHP » Exception com php -->
 
Avaliação: Não avaliado | Publicado em: 01/06/2008
Exception com php
José Roberto Gomes da Silva programador PHP na RCT Retail, desenvolve trabalhos em PHP/Javascript, Action Script


Desenvolvi e utilizo uma classe para tratamento de erros com exception em php que vou compartilhar com vocês agora.
Esse método de exception pode ser encontrado no php.net, e pra mim é um método bem flexivel para tratamento de erros.
Tentei deixar bem comentado na construção da classe para ficar mais fácil de ser entendido os métodos que principais de utilização
bem... vamos à classe.



/**
 * Declaração da classe para tratamento de erros
 * A classe deve ser extendida da classe Exception do PHP
 */
 class MyException extends Exception {
     //Faço a declaração das variávis que vou utilizar no corpo da classe
     private $cod          = 0,
                   $msg          = "",
                   $erromsg  = "";
    
     //Aqui faço a declaração do método construtor de classe
     // Esse método recebe os seguintes parametros:
     // $cod - Código de erro
     // $msg - Uma mensagem de erro personalizada
     // $erromsg - Uma mensagem de erro padrão
      public function __construct( $cod = 0 , $msg , $erromsg ) {
         
          //Sobreescrevo as propiedades da classe passando os parametros
          $this->cod          = $cod;
          $this->msg         = $msg;
          $this->erromsg = $erromsg;
          
          //Aqui eu chamo o construtor da classe pai para garantir o funcionamento correto da minha classe        
          parent::__construct( $msg , $cod );
         
          //Aqui chamo o método de gravação do log da minha classe
          //Este método vai gravar em um arquivo texto os erros que a exception detectar
          $this->WriteLog();
                       
      }
      
      /**
       * Metodo retorna erro formatado
       */
      public function getError() {
          //Com a chamada desse método imprime na tela o erro captado pela exception
          return     "<hr><pre>" .
                  "<br>" .
                  "Erro[ {$this->cod} ] {$this->msg}<br>{$this->erromsg}" .
                  "</pre></hr>";
         
      }
      
      /**
       * Método grava num log o erro gerado
       */
      private function WriteLog() {
         //Define o arquivo que será criado ou gravado caso exista
         //Coloco como nome o nome da classe seguido de log e da data de criação do mesmo
        $txt = __CLASS__ . "_log_" . date("dmY") . "txt";
           
         //Verifico se o arquivo existe, caso não exista defino o cabeçalho do arquivo de log
         if( !file_exists( $txt )){
             
         $msg = "/************************************************** " .
                " * Arquivo de log para Moneraty " .
                " * " .
                " * ClassName: " . __CLASS__ . " " .
                " * Data Criação: " . date("d/m/Y H:i") . " " .
                " * Autor: José Roberto [PHP/Javascript] " .
                " *************************************************/ " .
                "------------------------------------------------------------------- ";
                     
         }else
             $msg = "";
           
         //Abro o arquivo para edição
         if( $file = fopen( $txt , "a+" ) ) {
       
             //Preparo a mensagem que será gravada no arquivo de texto
            $msg .=    __CLASS__ . " hora: ".date("H:i") . " " .
                    "Erro [ {$this->cod} ]: linha ( {$this->line} ) " .
                    "{$this->msg} " .
                    "{$this->erromsg} " .
                    "------------------------------------------------------------------- ";
           
            //Executo a gravação do arquivo e em seguida fecho o mesmo
            fwrite( $file , $msg );
            fclose( $file );
             
         }
         
      }
      
      /**
       * @param Integer $cod     #Codigo do erro
       * @param String  $msg     #Mensagem de erro
       * @param String  $file    #Arquivo
       * @param Integer $line    #Linha
       * @example Método para chamar no erro handler # set_error_handler(array('MyException', 'throwError'), E_ALL);
       *
       * @static
       */
      static public function throwError( $cod , $msg , $file , $line ) {
          //utilizo esse método para setar no erro Handler a chamada da classe
          $this->file = $file;
          $this->line = $line;
                   
          throw new MyException( $cod , $msg );
         
      }
      
 }


Para chamar a classe no script basta criar um bloco try catch utilizado ela como parametro e usar o throw para dispara a exception, ou setar direto no erro_handler

Ex:

try{
     
      caso haja algum erro na conexão com a base de dados, o bloco catch será chamado
      if( !$db = mysql_connect("host","usuario","senha") )
           throw new MyException( mysql_errno() , "Não foi possível estabelecer conexão com a base!!!" , mysql_error() );

     
}catch( MyException $exception ){
           
             //aqui eu chamo o método para gravação no log caso eu queira que o erro seja gravado...
             $exception->WriteLog();
             //da mesma forma se eu quiser printar o erro na tela, chamo o método encarregado de retornar o erro formatado.
             print $exception->printErro();
        
}

ou setar direto no erro_handler:

Ex:

//associo ao handler a classe MyException statando o método static
set_error_handler(array("MyException","throwError"), E_ALL );

Desta forma eu tenho várias possibilidades de tratar meus erros de uma forma bem prática.
Espero que gostem....
abraço!!!