Introdução a manipulação de erros em PHP

Abordaremos os pontos básicos na manipulação de erros em PHP. Humanos erram, um computador obviamente não é humano e por isso erros devem ser evitados ao extremo. E quando eles acontecerem seu sistema deve estar preparado para detectá-los e agir da melhor forma. A manipulação de erros dependerá mais do programador do que de qualquer outra coisa.

[ Hits: 29.986 ]

Por: Lorran Luiz em 22/01/2009 | Blog: http://lorranluiz.hostingtribe.com/


Um código básico com tratamento de erros



Veremos e entenderemos como funcionaria então um código básico completo que trataria de uma maneira certa os possíveis erros que ocorressem durante sua execução.

O código

O código que se seguirá é meramente explicativo e por isso talvez não possua utilidade numa situação real.
  • Criaremos um código onde será criado um manipulador de arquivos;
  • O conteúdo do arquivo será lido;
  • Efetuaremos uma conexão com o servidor de banco de dados;
  • Esse conteúdo será inserido numa célula de uma tabela de um banco de dados;
  • E se tudo ocorrer bem, será exibida a mensagem: Operação efetuada com sucesso;
  • Caso ocorra um erro será exibida uma mensagem de erro que será reportada ao programador.

Veja abaixo:

//A CLASSE:

class ArmazenadorDeArquivoEmDB {
    protected $db_obj;
    protected $db_usuario;
    protected $db_senha;
    protected $db_dsn;
    protected $nomeDoArquivo;
    protected $manipuladorDoArquivo;
    protected $conteudoDoArquivo;
    protected $db_tabela;
    protected $db_dbName;

    public function __construct($usuario, $senha, $tabela, $db, $servidor) { //Construir objeto
        $this->db_usuario = $usuario;
        $this->db_senha = $senha;
        $this->db_tabela = $tabela;
        $this->db_dbName = $db;
        $this->db_dsn = $servidor;
    }

    public function conectar() {
        if(!($this->db_obj = @mysql_connect($this->db_dsn, $this->db_usuario, $this->db_senha))) {
            throw new DBException("Não foi possível conectar ao banco de dados", 281); //Lembrando que o código de erro não é um parâmetro obrigatório
        }
    }

    public function armazenarArquivoNoDB($nomeDoArquivo) { //O parâmetro requer endereço completo do arquivo
        $this->nomeDoArquivo = $nomeDoArquivo;
        try {
                if (empty($this->db_obj)) { //Se não existir uma conexão aberta com o DB
                    $this->conectar();
                }
            } catch  ( DBException $e ) { //Caso haja algum erro durante a tentativa de conexão...
                throw $e;                        // ...o "alarme" irá disparar
            }

        //Iremos abrir o arquivo:
        if (!file_exists($nomeDoArquivo)) throw new FopenException($nomeDoArquivo, "O arquivo especificado não existe.", 282);
        if (!($this->manipuladorDoArquivo = @fopen($nomeDoArquivo, "r"))) throw new FopenException($nomeDoArquivo, "Não foi possível abrir um manipulador para este arquivo.", 283);
        if (!($this->conteudoDoArquivo = @fread($this->manipuladorDoArquivo, intval(sprintf("%u", filesize($nomeDoArquivo)))))) throw new FopenException($nomeDoArquivo, "Não foi possível abrir o conteúdo deste arquivo.", 284); //O 2º parâmetro de fread() possibilita a leitura de arquivos maiores que 2GB

        //Armazenaremos agora o conteúdo do arquivo no DB
        $sql = 'INSERT INTO `' . $this->db_dbName . '`.`' . $this->db_tabela . '` (`nome`, `conteudo`) VALUES (\'' . $this->nomeDoArquivo . '\', \''. $this->conteudoDoArquivo . '\');';
        if(!($insert = @mysql_query($sql))) throw new DBException("Não foi possível inserir o arquivo no banco de dados.", 285);
        else echo '<html><head></head><body onload="alert(\'O arquivo foi armazenado com sucesso no banco de dados\')"></body></html>';
    }
}

//O OBJETO EM AÇÃO:

$armazenadorDeArquivoEmDB = new ArmazenadorDeArquivoEmDB("usuario", "senha", "tabela", "banco_de_dados", "sevidor"); //Criamos um objeto que armazena um arquivo num banco de dados

try { //Tentiva de conexão
    $armazenadorDeArquivoEmDB->armazenarArquivoNoDB("Ergue-te Marcos.txt"); //Aqui entra o nome do arquivo a ser armazenado no DB
} catch ( DBException $e ) {
    //Houve um erro relativo ao banco de dados
    echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informações sobre a exceção
    $gossipy->reportar($e); //A nível exemplificativo, temos este objeto fictício, imaginário, que envia por email informações sobre o erro ao programador
} catch ( FopenException $e ) {
    //Houve um erro referente ao arquivo, e podemos dar um tratamento específico a este tipo de exceção!
    echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informações sobre a exceção
    $gossipy->reportar($e); //A nível exemplificativo, temos este objeto fictício, imaginário, que envia por email informações sobre o erro ao programador
}

Poderíamos ter explorado mais desta fantástica linguagem que é o PHP e ter feito um tratamento de erros mais proveitoso no código acima, mas acho que para fins meramente explicativos e didáticos não é necessário tanta complexidade.

Vocês podem ver que poderíamos ter criado no código acima subclasses de Exception bem mais específicas, a idéia é a mesma de quando criamos as classes "FopenException" e "DBException". Classes mais específicas para a manipulação de exceções relativas ao banco de dados poderiam ser definidas apenas estendendo a classe "DBException", veja:

SQLException extends DBException { }

E cada vez podemos ir tornando as exceções mais específicas (e a manipulação mais precisa).

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Situações de possíveis erros
   3. Preparando seu código para as exceções
   4. Estendendo e especificando exceções
   5. Um código básico com tratamento de erros
   6. Resumindo
Outros artigos deste autor

Servidor LAMP + PHPMyAdmin + Webalizer

Leitura recomendada

XSS - Um exemplo de ataque

Autenticação de sites com PHP e MySQL

Vulnerabilidade em formulário PHP

Instalações PHP não seguras

PHP: Programando com segurança

  
Comentários
[1] Comentário enviado por matux em 22/01/2009 - 16:46h

Bom Artigo, com certeza muito útil.
Já vou fazer uns testes!
Parabéns!

[2] Comentário enviado por luizhacker em 22/01/2009 - 21:35h

Complementando...

Não é preciso necessariamente que para exibir informações através do objeto de exceção você digite $e->__toString(), pois o métodos especial __toString() é executado automaticamente quando o objeto é requisitado como string, ou seja, você só precisará indicar o próprio objeto. Veja:

echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n$e"); //Exibir string contendo informações sobre a exceção

Um abraço!

[3] Comentário enviado por renato.leite em 23/01/2009 - 10:35h

Otimo artigo, ajuda bastante...

[4] Comentário enviado por albertguedes em 24/01/2009 - 02:28h

Cara, tá no favoritos.
valeu MEEEESMO hehehe.

Aparece ai no canal IRC do VOL

http://www.vivaolinux.com.br/artigo/Canal-IRC-do-VOL-Participe-voce-tambem

[5] Comentário enviado por everton3x em 29/01/2009 - 17:14h

Muito bom artigo!

Saiu da mesmisse de "como conectar ao banco de dados" ou de "como manipular arquivos com PHP".



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts