Skip to content

Criando sua própria exceção no PHP

\UTC\02 10 \10\UTC fevereiro \10\UTC 2009

Muita gente não sabe, mas o PHP dá suporte a exceções, como no C++: os famosos blocos try e catch. Acontece que é possível fazer sua própria classe para lidar com exceções.

Mas pra quê, você deve estar se perguntando… Aqui vai um exemplo: atualmente estou trabalhando num projeto que usa PHP e muita interatividade em AJAX, e, para tal, estou utilizando a API de AJAX ExtJS. Portanto, em qualquer comunicação com o servidor espera-se receber uma resposta no formato JSON (JavaScript Object Notation). A idéia é fazer com que qualquer erro, como um formulário com campos inválidos, retorne sempre uma string no formato JSON, para que esse erro seja processado pela interface no lado do cliente. Vamos ao código:

< ?php

class ExceptionJSON extends Exception
{

    private $erros;		// array contendo os erros
    private $tipo;		// int

    const VALIDACAO 	= 1;
    const INSERCAO		= 2;
    const SELECAO 		= 3;
    const ATUALIZACAO 	= 4;

    function __construct( $mensagem = null, $codigo = 0, $tipo, $vetor = null )
    {
        parent::__construct( $mensagem, $codigo );

        $this->erros 	= $vetor;
        $this->tipo 	= $tipo;

        if( $this->tipo != ExceptionJSON::VALIDACAO )
            $this->logarErro();

    }

    public function enviaJSON()
    {
        if( $this->tipo == ExceptionJSON::VALIDACAO )
            $temp = array( "success" => false, "errors" => $this->erros );
        else
            $temp = array(
                "success" => false,
                "msg" => "Ocorreu um erro no sistema. Se persistir, entre em contato com o suporte técnico." );

        echo json_encode( $temp );
    }

    private function logarErro()
    {
        # montando a mensagem personalizada
        $msg = $this->file . ' linha ' . $this->line . ': cod. '. $this->code . '. msg: ' . $this->message;

        # caminho do arquivo
        $arquivo = '../logs/' . date('m.Y') . '.log';

        # detalhes sobre o evento
        $reg = date("d.m.Y as H:i:s");
        $reg .= "IP: $_SERVER[REMOTE_ADDR], ";
        $reg .= "Navegador: $_SERVER[HTTP_USER_AGENT], ";
        $reg .= "Msg: \"$msg\"\r\n";

        # abre, escreve e fecha o arquivo
        $handle = fopen( $arquivo, 'a' );
        fwrite( $handle, $reg );
        fclose( $handle );
    }
}

?>

Explicando o que tudo isso quer dizer:

Primeiro criamos a classe ExceptionJSON, que herda os dados da classe base, definida no PHP, chamada Exception. Criei duas variáveis e alguns tipos de erros personalizados.

No construtor, esperamos a mensagem, o código do erro (para verificação futura), o tipo do erro (validação, inserção, seleção ou atualização) e um vetor contendo os erros para os casos de erros de validação. Chamamos o construtor da classe Exception e organizamos os nossos dados. Logo mais falarei sobre o método logarErro().

O nosso foco é o método enviaJSON(), o qual fará o output com o erro em questão. Primeiro, se o erro for de validação, preciso enviar uma JSON na forma {“success”: false, “errors” => vetor} porque o ExtJS espera que seja assim. Exemplo:

vetor[ “nomeDoCampo” ] = “Mensagem de erro de validação.

Dessa forma, um erro no campo chamado “nome” será grifado em vermelho e aparecerá a mensagem ao lado da caixa quando o vetor de erros contiver:

vetor[ “nome” ] = “Nome inválido. Digite somente letras.”;

O bom é que o vetor pode conter n campos com as mensagens que o ExtJS grifará todos eles e mostrará as suas respectivas mensagens de erro.

Mais abaixo no código, fazemos o nosso vetor com uma mensagem de erro padrão para erros de inserção, atualização ou seleção para caso aconteça algum erro inesperado no banco de dados. Assim, a interface responderá com a mensagem, dizendo que houve um erro e não causará problemas ao usuário.

Por fim, o método logarErro() nos ajuda a rastrear aqueles erros de banco de dados que não estávamos realmente esperando. Ele cria um arquivo de texto com o nome do mês atual e vai criando as entradas de erro.

Exemplo de chamada de exceção:

try {

    parent::insereNoBanco( $cpf, $pass, 3, $nome, $email, $tel, $cel, $fax,
        $endereco, $bairro, $cidade, $uf, $cep, $pais );

    if( ! $this->insereEquipamentosOpera( $equipsOpera, null, $temAgenda ) )
      if( sizeof( $erros ) )
	      throw new ExceptionJSON( "Validação mal-sucedida.", 4, ExceptionJSON::VALIDACAO );

    echo json_encode( array( "success" => true ) );
}
catch ( ExceptionJSON $e ) {
    if( $e->getCode() == 2 || $e->getCode() == 3 || $e->getCode() == 5 )
        mysql_query( "DELETE FROM `tb_usuario` WHERE `Login_usuario` = '$cpf' " );

    $e->enviaJSON();
}

Espero que tenham gostado do nosso primeiro post do tem coisa pior. Qualquer dúvida estou a disposição.

Abraços e até a próxima.

Documentação da classe no php: http://br.php.net/manual/en/class.exception.php

Anúncios
No comments yet

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: