Tratamento de erros no PHP
No processo de criação de scripts e aplicações web o tratamento de erros é uma parte importante. Se o seu código não tiver código de checagem de erros ele pode parecer muito pouco profissional e você pode estar correndo riscos de segurança.
Neste post nós veremos algumas das mais comuns técnicas de checagem de erros no PHP.
Nos mostraremos diferentes métodos de tratamento de erros:
- Comandos "die()"
- Erros customizados e eventos de erros
- Mostrando erros
O primeiro exemplo mostra um script que abre um arquivo de texto:
1:<?php
2:$file=fopen("welcome.txt","r");
3:?>
Se o arquivo não existe você deve receber um erro como o mostrado abaixo:Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:Para evitar que o usuário veja uma mensagem de erro como a vista acima, nos vamos testar se o arquivo existe antes de abri-lo.
No such file or directory in C:\webfolder\test.php on line 2
1:<?php
2:if(!file_exists("welcome.txt")) {
3: die("Arquivo não encontrado");
4:}
5:else {
6: $file=fopen("welcome.txt","r");
7:}
8:?>
Agora se o arquivo não existir você recebera a mensagem:Arquivo não encontradoO código acima é mais eficiente do que o anterior porque ele usa um simples mecanismo de lidar com erros para parar a execução depois do erro.
No entanto, simplesmente parar a execução nem sempre é a melhor forma de proceder. Vamos ver outras possibilidades para lidar com erros.
Criando um tratador de erros customizado
Criar um tratador de erros customizado é bem simples. Nós simplesmente criamos uma função especial que é chamada quando um erro ocorre no PHP.
Esta função deve ser lidar com pelo menos dois parâmetros (error level e error message) mas ela pode aceitar até cinco parâmetros (arquivo, numero da linha e contexto do erro).
Sintaxe
error_function(error_level,error_message, error_file,error_line,error_context)
Parâmetro | Descrição |
---|---|
error_level | Requerido. Especifica um nível de erro para o erro. Deve ser um valor numérico. Veja a tabela abaixo para os possíveis valores. |
error_message | Requerido. Especifica a mensagem para o erro |
error_file | Opcional. Especifica o arquivo em que o erro aconteceu |
error_context | Opcional. Especifica um array com cada variável e seus valores quando o erro aconteceu |
Niveis de erros
Estes são os diferentes valores para os níveis de erros que podem ser passados para a função de tratamento de erros:
Valor | Constante | Descrição |
---|---|---|
2 | E_WARNING | Erros de execução não fatais. A execução do script não é interrompida. |
8 | E_NOTICE | Avisos em tempo de execução. O script encontrou alguma coisa que pode ser um erro mas também pode acontecer quando o script esta rodando normalmente. |
256 | E_USER_ERROR | Erro fatal gerado pelo usuário. Este nível é compatível ao E_ERROR criado pelo programador com a função trigger_error() |
1024 | E_USER_NOTICE | Erro de execução não fatal criado pelo usuário. É equivalente ao nível E_WARNING mas é criado pelo programador pela chamada da função trigger_error() |
4098 | E_RECOVERABLE_ERROR | Erro fatal que tem a possibilidade de ser tratado e recuperado. |
4098 | E_ALL | Todos os erros e mensagens, com excessão do nível E_STRICT (É parte do E_ALL a partir do PHP 6) |
Vamos agora criar a função que trata os erros:
1:<?php
2:function customError($errno, $errstr) {
3: echo "<b>Erro:</b> [$errno] $errstr<br />";
4: echo "Parando a execução";
5: die();
6:}
7:?>
O código acima é uma função de tratamento de erros simples. Quando ela é chamada, ela recebe o nível do erro e a mensagem do erro. Ela então imprime o nível do erro e a mensagem e finaliza a execução.Agora que nós criamos a função de tratamento de erros nós precisamos decidir quando ela deve ser chamada.
Ajustando o tratador de erros
O tratador de erros padrão no PHP é o que se vê em geral. Nos vamos fazer o tratador de erros acima o padrão durante a execução do script.
È possivel modificar o tratador de erros para funcionar apenas para alguns erros de forma que diferentes erros sejam tratados de diferentes formas. No entanto, neste exemplo nós iremos usar o tratador de erros criado acima para lidar com todos os tipos de erros.
1:<?php
2:set_error_handler("customError");
3:?>
Como nós queremos que a função lide com todos os erros, a função set_error_handler() precisa de somente um parâmetro. Um segundo parâmetro poderia ser adicionado especificando o nível de erro.Exemplo
Vamos testar o tratador de erros tentando imprimir uma variável que não existe:
1:<?php
2://função de tratamento de erros
3:function customError($errno, $errstr) {
4: echo "<b>Error:</b> [$errno] $errstr";
5:}
6://ajusta o tratador de erros
7:set_error_handler("customError");
8://cria um erro
9:echo($test);
10:?>
A saida do código acima deve aparecer da seguinte forma:Error: [8] Undefined variable: testLançando um erro
Em um script em que os usuários podem fornecer dados é útil lançar erros quando uma entrada ilegal ocorre. No PHP, isto é feito com a função trigger_error().
Exemplo
No exemplo abaixo um erro acontece se a variável "$test" é maior que 1:
1:<?php
2:$test = 2;
3:if ($test > 1){
4: trigger_error("Value must be 1 or below");
5:}
6:?>
A saida do código acima deve se parecer com o que temos abaixo:Notice: Value must be 1 or belowUm erro pode ser criado em qualquer lugar do script. Adicionando um segundo parâmetro você pode especificar que nível de erro é criado.
in C:\webfolder\test.php on line 6
Valores possívels:
- E_USER_ERROR - Erro fatal gerado pelo usuário. Não é possível se recuperar deste tipo de erro. 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
Neste exemplo um E_USER_WARNING acontece se a variável "$test" é maior que 1. Se um E_USER_WARNING acontece nós usaremos o nosso tratador de erros e finalizar o script:
1:<?php
2://Função de tratamento de erros
3:function customError($errno, $errstr)
4: {
5: echo "<b>Erro:</b> [$errno] $errstr<br />";
6: echo "Finalizando o Script";
7: die();
8: }
9:
10://Ajustrando o tratador de erros
11:set_error_handler("customError",E_USER_WARNING);
12://Criando o erro
13:$test = 2;
14:if ($test > 1) {
15: trigger_error("O valor deve ser 1 ou menos",E_USER_WARNING);
16:}
17:?>
A saida do código acima deve ser parecida com a mostrada abaixo:Error: [512] O valor deve ser 1 ou menosAgora que nós aprendemos como criar nossos próprios erros e como trata-los vamos ver como fazer um log de erros.
Finalizando o Script
Log de erros
Por padrão o PHP envia o log de erros para o sistema de log do servidor ou para um arquivo dependendo da configuração no arquivo php.ini. Usando a função error_log()
você pode enviar log de erros para um arquivo especificado ou para um destino remoto.
Um bom exemplo seria enviar para você mesmo e-mails notificando sobre erros específicos.
Enviando uma mensagem de erro por email
No exemplo abaixo nós iremos mandar um e-mail com uma mensagem de erro e finalizar a execução se um erro específico acontece:
1:<?php
2://função de tratamento de erros
3:function customError($errno, $errstr) {
4: echo "<b>Erro:</b> [$errno] $errstr<br />";
5: echo "O Webmaster foi notificado";
6: error_log("Erro: [$errno] $errstr",1,
7: "alguem@example.com", "From: webmaster@example.com");
8:}
9://ajustando tratador de erros
10:set_error_handler("customError",E_USER_WARNING);
11://criando o erro
12:$test = 2;
13:if ($test>1) {
14: trigger_error("O valor deve ser 1 ou menos",E_USER_WARNING);
15:}
16:?>
A saida do código acima deve ser a seguinte:
Erro: [512] O valor deve ser 1 ou menosO e-mail recebido do código deve se se parecer assim:
O Webmaster foi notificado
Erro: [512] O valor deve ser 1 ou menosIsto não deve ser usado com todos os erros. Erros normais devem ser logados no servidor usando o sistema de log do PHP.
Fonte
Estou aprendendo o php e nas minhas pesquisas achei seu blog. Gostei muito de tudo e em especial como escreve de maneira que todos possam entender. Muito obrigado por compartilhar o seu conhecimento, espero que voce receba coisas boas na vida como retribuição. Abraços Joao.
ResponderExcluirObrigado. Se tiver alguma dúvida, você pode perguntar aqui nos comentários também.
ExcluirPHP Error Handling
ResponderExcluir