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: 28.895 ]

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

Criptografia do método GET no PHP

Dicas básicas de segurança no PHP

Autenticação de sites com PHP e MySQL

Dados sensíveis em arquivos com extensão .inc

Instalações PHP não seguras

  
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