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.
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:
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' );
?>
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

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:
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 { }

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.
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() ).

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:
Programming and design by Samuel Corradi