Samuel Corradi

Blog

Tratando erros com PHP - Parte 3 (Final)

seguranca, programacao, php, desenvolvimento

Segunda parte da série de estudos sobre tratamento de erros em scripts PHP. Acesse também a parte 1 e parte 2.

Exceções

Talvez a melhor forma de tratar erros com PHP seja utilizando Exceções. Mas o que são Exceções?

Exceções são objetos derivados da classe Exceptions e tem como função lançar erros para que o programador possa interceptá-los e trata-los da forma que achar melhor. E como acontece esse “lançamento” e o tratamento? Vamos utilizar um programa que tenta abrir um arquivo que não existe como exemplo:

Disparando exceções

A qualquer momento podemos lançar uma exceção. Normalmente verificamos se uma condição necessária para o funcionamento do programa é verdadeira, caso contrário lançamos usando o comando:

throw new Exception( 'Mensagem do erro' );

Veja um exemplo prático:

<?php

class LeitorArquivo
{
    public function abrir( $arquivo )
    {
        if( !file_exists( $arquivo ) ) {
        throw new Exception( 'O arquivo não existe.' );
    	}
	}
}
$leitor = new LeitorArquivo();
$leitor->abrir( 'inexistente.txt' );

?>
Capturando exceções

Se executarmos o código acima, um erro semelhante a esse é retornado:

Fatal error: Uncaught exception 'Exception' with message 'O arquivo não existe.' in
D:xampplitehtdocsindex.php:10 Stack trace: #0 D:xampplitehtdocsindex.php(16):
LeitorArquivo->abrir('inexistente.txt') #1 {main} thrown in D:xampplitehtdocsindex.php on line 10

Fail

Para resolver isso, invocamos nossa função abrir() - que tem a possibilidade de criar uma exceção - dentro de um bloco try no script. Assim, caso a exceção seja lançada, usamos o bloco catch para capturar essa exceção e tratar o erro. Umas das formas de tratar o erro é gravando a mensagem da exceção em um arquivo de log.

<?php

try
{
    $leitor = new LeitorArquivo();
    $leitor->abrir( 'inexistente.txt' );
}
catch( Exception $e )
{
	LogManager::log_write( $e->getMessage() );
}

?>

Como podemos ver, primeiro tentamos executar a função usando try. Se a função executada lançou uma exceção, a exceção é capturada pelo catch e um objeto do tipo Exception é criado e referenciado pela variável $e (nome opcional) para que possamos tratar o erro. Qualquer objeto derivado da classe Exception possui métodos que informam ao desenvolvedor um relado do que aconteceu. Esses métodos são:

Customizando os tratamentos por exceções

Continuando nosso tratamento de erros usando exceções, observarmos que uma exceção lançada pode ser manipulada por um bloco catch (que captura a exceção).

Mas nesse caso, toda exceção lançada com o objeto Exception será sempre tratada da mesma forma. No exemplo acima, qualquer erro que tenha gerado uma exceção terá sua mensagem gravada em log e nada mais além disso.

Para podemos customizar as ações, é necessário criar outras classes, de nomes diferentes, estendidas da classe principal Exception. Exemplo:

class OutraExcecao extends Exception { }

Fail

Assim, no lugar onde uma exceção deve ser lançada, ao usarmos 'throw new OutraExcecao', podemos colocar abaixo um 'catch(OutraExcecao $e)' com um comportamento totalmente diferente.

O que quero demonstrar é: podemos criar vários objetos de exceção diferentes (cada um específicos para um tipo de erro) apenas estendendo a classe principal Exception. E então usar vários catch para tratar a exceção lançada de acordo com seu tipo.

Conclusão

Acredito que o tratamento através de exceções seja o melhor pois, quando ocorre um erro dentro de um bloco try (e uma exceção é lançada), o código é interrompido naquele lugar, e sua execução é transferida para o ponto da captura (aonde está a função catch() ).

Fail

Ou seja, o código com erro não é tratado pela própria função onde aconteceu o erro, mas por um código a parte. Isso ajuda (e MUITO) na customização, modularidade e segurança.

Aqui termina nosso tutorial que foi dividido em três partes. Espero que tenham gostado!

E não deixem de acessar também a parte 1 e parte 2 desse estudo.

Incluir comentário






0 mensagens enviadas

Últimos posts:

Destaques:

PHP Coupé - Desenvolvimento rápido e reaproveitável vForm - Validador universal de formulários

Programming and design by Samuel Corradi