Curso de PHP Orientado a Objetos – Parte 11
Décimo primeiro artigo do curso de PHP Orientado a Objetos. Dessa vez, veremos o tratamento de erros no PHP, prática fundamental para o desenvolvimento com qualidade.
Para conhecer as demais partes do curso, clique aqui.
Ao final deste artigo, você será capaz de:
- Utilizar as funções de tratamento de erros com: die(), trigger_error(), set_error_handler e error_log;
- Realizar o tratamento de exceções.
Tratar erros é considerado uma boa prática quando o assunto é desenvolvimento de sistemas. Essa prática diferencia programadores de verdade de curiosos, seu código fonte será muito mais valorizado, seguro e robusto quando aplicado as técnicas de tratamento.
No PHP existem três tipos de erros: Notices (notificações), Warnings (alertas) e os Fatals (fatais). Os erros fatais quando ocorrem fazem com que o script finalize de forma imediata. Pode ocorrer quando, por exemplo, uma função ou um método que não existe é chamado.
A função die()
Antes de explicar sobre a função die(), vale ressaltar que seu uso deve ser cuidadoso, pois quando chamada, a função die() interrompe a execução do script. Podemos dizer que se trata de uma função muito “radical”, por isso, seu uso não é recomendável, salvo alguma exceções.
Vamos analisar:
1 2 3 4 5 6 7 8 9 10 11 12 |
//verificando se o método Teste() existe if (function_exists("Teste")){ //Caso exista, executamos echo Teste(); } else { /*Caso não exista * interrompemos a execução * usando a função die() */ die("Ocorreu um erro"); } echo "Isso não será impresso, pois o script não vai chegar até aqui"; |
Perceba que a execução do script é interrompida quando a função die() é chamada, o que faz com que seja impresso no navegador somente a frase “Ocorreu um erro”. Ignorando o restante do script.
Lançamento de Erros
Essa é uma forma elegante de se manipular erros. Utilizamos basicamente duas funções: trigger_error() e a set_error_handler(). A primeira lança um erro e a segunda define uma função que manipulará os erros lançados.
trigger_error()
Esta função espera dois parâmetros:
- erro: Mensagem de erro gerada;
- tipo: Tipo de erro.
- E_USER_ERROR: Erro fatal gerado pelo usuário. A execução do script é interrompida;
- E_USER_WARNING: Erro não fatal gerado pelo usuário. A execução do script não é interrompida;
- E_USER_NOTICE: Padrão. Aviso gerado pelo usuário. A execução do script não é interrompida.
1 2 3 4 5 6 7 8 9 |
/* Esperamos receber * algo passado por $_GET */ if (!(isset($_GET['nome']))){ /* Caso não seja passado * geramos o erro */ trigger_error("O campo nome não foi informado.", E_USER_WARNING); } |
Como resultado a execução deste script, supondo que não tenha sido passado nada através do campo nome, o seguinte erro seria mostrado:
1 |
Warning: O campo nome não foi informado. in c:Xamppprojetoindex.php line ... |
Perceba que a saída do erro agora foi tratada.
set_error_handler()
Essa função defini qual função manipulará os erros lançados.
É possível por exemplo, além de tratar os erros com mensagens personalizadas, enviá-los por email, armazená-los em um arquivo de log ou mesmo em um banco de dados.
Por padrão o php envia o log de erros para o sistema de log do servidor onde roda a aplicação, isso depende da configuração do php.ini. Podemos utilizar a função error_log() em conjunto com a função set_error_handler() para enviar emails sobre os erros selecionáveis.
Vamos ao exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* Primeiro vamos criar a função * que trata os erros e faz o envio do email */ function erroEmail($erro, $erro_str){ } // Agora inicializamos o tratador de erros set_error_handler("erroEmail", E_USER_WARNING); // Criando um erro qualquer, para ver a coisa funcionar $teste = true; if ( $teste != false ){ trigger_error("O valor não é falso :( ", E_USER_WARNING); } |
Para o exemplo funcionar é necessário que você tenha um servidor de email configurado. Provavelmente se você testar localmente, não dará certo.
Você também pode, ao invés de enviar o email, armazena-lo em um arquivo de texto utilizando a função fopen().
Tratamento de exceções
Esta maravilha (sim, é fantastico) foi incluída no PHP 5. Antes já existia para outras linguagens de programação como C++, Java e Delphi. Basicamente uma exceção muda o curso normal de um script caso ocorra um erro.
Uma exceção é um objeto especial derivado da classe Exception que contêm alguns métodos que relatam ao programador o que aconteceu. Vamos agora conhecer estes métodos:
- getMessage() – Retorna a mensagem de erro;
- getCode() – Retorna o código de erro;
- getFile() – Retorna o arquivo no qual o erro ocorreu;
- getLine() – Retorna a linha na qual o erro ocorreu;
- getTrace() – Retorna um array com as ações até o erro;
- getTraceAsString() – Retorna as ações em forma de string.
Quando executamos operações que podem resultar em erros, usamos o bloco try para monitorá-los. Dentro das operações críticas, quando ocorre um erro, usamos o comando throw para “lançar” uma exceção (Objeto Exception), para interromper a execução do bloco contido na clausula try, a qual recebe esta exceção e repassa para outro bloco de comandos catch. Dentro do bloco catch podemos definir o que fazer: Emitir uma mensagem de erro para o usuário e cancelar a execução do script ou armazenar os detalhes do erro em um arquivo de log e etc.
Para simplificar, vamos ao exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
//Uma função que abre um deternimado arquivo function AbrirArquivo( $arquivo = null ){ //Caso o parametro arquivo esteja em vazio... if( !$arquivo ){ //Geramos a execeção throw new Exception("Parâmetro com o nome do arquivo não especificado."); } //Se o arquivo não existir... if( !file_exists($arquivo) ){ //Geramos outra exceção throw new Exception("Arquivo não encontrado."); } //Caso não consiga ler o arquivo.. if( !$data = @file_get_contents($arquivo) ){ //Também é gerada uma exceção throw new Exception("Não foi possível ler o arquivo."); } // Caso esteja tudo certo, retornamos os dados return $data; } /* "protegemos" a chamada da função AbrirArquivo() * utilizando o try */ try{ $arquivo = AbrirArquivo("/log/error.log"); echo $arquivo; } /* O catch captura o erro e trata * da forma com que desejar */ catch( Exception $exc ) { /* Imprimimos o arquivo, * a linha e a mensagem * de erro gerada. */ echo $exc->getFile() . " - Na linha " . $exc->getLine() . " # " . $exc->getMessage(); } |
O resultado, caso o arquivo não seja encontrado:
1 |
c:XamppaulaTratamentoErros.php - Linha 10 # Arquivo não encontrado. |
Tratar erros é fundamental, essa prática protege o código e deixa o algoritmo com aspecto bem mais profissional.
E assim finalizamos mais um artigo do curso.
Estamos chegando ao fim do que eu havia pensado em escrever sobre este tema. Teremos apenas mais um artigo, sobre PDO, que pretendo publicar amanhã (12 de abril), caso a febre não volte a me perseguir.
Não se esqueça de comentar!
Realmente o tratamento de erro nos livra de vários problemas.
Ótimo artigo. Parabéns
Obrigado
Otimo artigo amigo, obrigado
Muito bom cara! Parabéns mesmo!
Excelente artigo. Obrigado por compartilhar…
Show de bola o código na linha 21. (if( !$data = @file_get_contents($arquivo) ){)
Leandro muito bom esse artigo parabéns.
Estou desenvolvendo uma aplicação mas não consigo tratar o erro que é gerado na conexão com o banco de dados. Poderia me ajudar?
O erro é este:
Fatal error: Maximum execution time of 30 seconds exceeded in C:projetosautoatendimentoincludes.php on line 53
Não gera exceptions nem nada, apenas encerra o processamento.
The hontsey of your posting is there for all to see