Tratamento de erros

O tratamento de erros padrão no PHP é bem simples. Uma mensagem de erro com o nome do arquivo, um número de linha e uma mensagem descrevendo o erro é enviada para o browser.

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
Lidando com erros: Usando a função die()

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:
No such file or directory in C:\webfolder\test.php on line 2
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.
   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 encontrado
O 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âmetroDescrição
error_levelRequerido. 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_messageRequerido. Especifica a mensagem para o erro
error_fileOpcional. Especifica o arquivo em que o erro aconteceu
error_contextOpcional. 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:


ValorConstanteDescrição
2E_WARNINGErros de execução não fatais. A execução do script não é interrompida.
8E_NOTICEAvisos 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.
256E_USER_ERRORErro fatal gerado pelo usuário. Este nível é compatível ao E_ERROR criado pelo programador com a função trigger_error()
1024E_USER_NOTICEErro 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_ERRORErro fatal que tem a possibilidade de ser tratado e recuperado.
4098 E_ALLTodos 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: test
Lanç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 below
in C:\webfolder\test.php on line 6
Um erro pode ser criado em qualquer lugar do script. Adicionando um segundo parâmetro você pode especificar que nível de erro é criado.

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
Exemplo

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 menos
Finalizando o Script
Agora que nós aprendemos como criar nossos próprios erros e como trata-los vamos ver como fazer um log de erros.

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 menos
O Webmaster foi notificado
O e-mail recebido do código deve se se parecer assim:
Erro: [512] O valor deve ser 1 ou menos
Isto não deve ser usado com todos os erros. Erros normais devem ser logados no servidor usando o sistema de log do PHP.

Fonte

3 comentários:

  1. 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.

    ResponderExcluir
    Respostas
    1. Obrigado. Se tiver alguma dúvida, você pode perguntar aqui nos comentários também.

      Excluir