Manejo de Erros PHP

No PHP, o tratamento de erros padrão é simples. Uma mensagem é enviada para o navegador, esta mensagem contém o nome do arquivo, o número da linha e uma descrição do erro.

Manejo de Erros PHP

Ao criar scripts e aplicações web, o tratamento de erros é uma parte importante. Se seu código falta a codificação de deteção de erros, o programa parece pouco profissional e abre portas para riscos de segurança.

Este tutorial introduz algumas das técnicas mais importantes de deteção de erros no PHP.

Vamos explicar diferentes métodos de tratamento de erros para você:

  • Sintaxe simples "die()"
  • Erros personalizados e gatilhos de erro
  • Relatório de erro

Tratamento básico de erros: usando a função die()

O primeiro exemplo mostra um script simples para abrir um arquivo de texto:

<?php
$file=fopen("welcome.txt","r");
?>

Se o arquivo não existir, você receberá um erro semelhante a este:

Aviso: fopen(welcome.txt) [function.fopen]: falha ao abrir fluxo: 
Nenhum arquivo ou diretório encontrado em C:\webfolder\test.php na linha 2

Para evitar que o usuário receba uma mensagem de erro semelhante à acima, detectamos a existência do arquivo antes de acessá-lo:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Arquivo não encontrado");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Agora, se o arquivo não existir, você receberá uma mensagem de erro semelhante a esta:

Arquivo não encontrado

Em comparação com o código anterior, o código acima é mais eficiente, pois ele adota um mecanismo simples de tratamento de erros para interromper o script após o erro.

No entanto, simplesmente interromper o script não é sempre a maneira correta. Vamos estudar as funções alternativas do PHP usadas para lidar com erros.

Criar gerenciador de erro personalizado

Criar um gerenciador de erro personalizado é muito simples. Nós simplesmente criamos uma função dedicada que pode ser chamada quando ocorrer um erro no PHP.

Esta função deve ser capaz de lidar pelo menos com dois parâmetros (nível de erro e mensagem de erro), mas pode aceitar até cinco parâmetros (opcionais: arquivo, número da linha e contexto de erro):

Sintaxe

error_function(error_level, error_message,
error_file, error_line, error_context)
Parâmetro Descrição
error_level

Obrigatório. Nível de relatório de erro definido pelo usuário para erro. Deve ser um valor numérico.

Veja a tabela abaixo: Nível de relatório de erro.

error_message Obrigatório. Regra de mensagem de erro definida pelo usuário para erro.
error_file Opcional. Especifica o nome do arquivo onde o erro ocorreu.
error_line Opcional. Especifica o número da linha onde o erro ocorreu.
error_context Opcional. Especifica um array que contém cada variável usada no momento do erro e seus valores.

Níveis de relatório de erro

Esses níveis de relatório de erro são diferentes tipos de erros que o manipulador de erros está destinado a lidar:

Valor Constante Descrição
2 E_WARNING Erros de tempo de execução não fatais. Não interrompe a execução do script.
8 E_NOTICE

Notificações de tempo de execução.

O script descobre que pode haver erros, mas também pode ocorrer enquanto o script está executando normalmente.

256 E_USER_ERROR Erros gerados pelo usuário fatais. Semelhantes às E_ERROR definidas pelo programador usando a função PHP trigger_error().
512 E_USER_WARNING Avisos gerados pelo usuário não fatais. Semelhantes às E_WARNING definidas pelo programador usando a função PHP trigger_error().
1024 E_USER_NOTICE Notificações geradas pelo usuário. Semelhantes às E_NOTICE definidas pelo programador usando a função PHP trigger_error().
4096 E_RECOVERABLE_ERROR Erros fatais capturáveis. Semelhantes a E_ERROR, mas podem ser capturados por manipuladores de erros definidos pelo usuário. (Ver set_error_handler())
8191 E_ALL

Todos os erros e avisos, exceto o nível E_STRICT.

(No PHP 6.0, E_STRICT é parte de E_ALL)

Agora, vamos criar uma função para lidar com erros:

function customError($errno, $errstr)
 { 
 echo "<b>Erro:</b> [$errno] $errstr<br />";
 echo "Fim do Script";
 die();
 }

O código acima é uma função de manipulação de erros simples. Quando acionada, ela obtém o nível de erro e a mensagem de erro. Em seguida, ela imprime o nível de erro e a mensagem e termina o script.

Agora que já criamos uma função de manipulação de erros, precisamos determinar quando acionar essa função.

Definir Manipulador de Erros

O manipulador de erros padrão do PHP é o manipulador de erros integrado. Pretendemos transformar a função acima em o manipulador de erros padrão durante a execução do script.

Pode-se modificar o manipulador de erros para que ele se aplique apenas a certos erros, permitindo que o script trate diferentes erros de maneiras diferentes. No entanto, neste exemplo, pretendemos usar nosso manipulador de erros personalizado para todos os erros:

set_error_handler("customError");

Aqui está o exemplo de um JSON traduzido para o português do Brasil:

Exemplo

Para testar este manipulador de erro, vamos tentar imprimir uma variável inexistente:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Erro:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

A saída do código acima deve ser semelhante a isso:

Erro: [8] Variável não definida: test

Ação de acionar erro

Em locais onde o usuário insere dados no script, é útil acionar erros quando a entrada do usuário é inválida. No PHP, essa tarefa é realizada pelo trigger_error().

Exemplo

Neste exemplo, se a variável "test" for maior que "1", ocorrerá um erro:

<?php
$test=2;
if ($test>1)
{
trigger_error("O valor deve ser 1 ou abaixo");
}
?>

A saída do código acima deve ser semelhante a isso:

Aviso: O valor deve ser 1 ou abaixo
em C:\webfolder\test.php na linha 6

Você pode acionar erros em qualquer lugar do script, usando o segundo parâmetro, você pode especificar o nível do erro acionado.

Tipos de erros possíveis:

  • E_USER_ERROR - Erro de tempo de execução gerado pelo usuário fatal. O erro não pode ser recuperado. A execução do script é interrompida.
  • E_USER_WARNING - Aviso de tempo de execução gerado pelo usuário não fatal. A execução do script não é interrompida.
  • E_USER_NOTICE - Padrão. Notificações de tempo de execução geradas pelo usuário. O script encontrou possíveis erros, que também podem ocorrer quando o script estiver executando normalmente.

Exemplo

Neste exemplo, se a variável "test" for maior que "1", ocorrerá um erro E_USER_WARNING. Se ocorrer um E_USER_WARNING, usaremos nosso manipulador de erro personalizado e encerraremos o script:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Erro:</b> [$errno] $errstr<br />";
 echo "Fim do Script";
 die();
 }
//set error handler
set_error_handler("customError", E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("O valor deve ser 1 ou abaixo", E_USER_WARNING);
 }
?>

A saída do código acima deve ser semelhante a isso:

Erro: [512] O valor deve ser 1 ou abaixo
Fim do Script

Agora que já aprendemos como criar nossos próprios erros e como acioná-los, vamos estudar a questão dos registros de erro.

Registros de erro

Por padrão, com base na configuração de error_log no php.ini, o PHP envia registros de erro para o sistema de logs de erro do servidor ou para um arquivo. Ao usar a função error_log(), você pode enviar registros de erro para um arquivo ou destino remoto especificado.

Enviar mensagens de erro para si mesmo por e-mail é uma boa maneira de obter notificações de erros específicos.

Enviar mensagens de erro através de E-Mail

Neste exemplo, se um erro específico ocorrer, enviaremos um e-mail com a mensagem de erro e encerraremos o script:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Erro:</b> [$errno] $errstr<br />";
 echo "Webmaster has been notified";
 error_log("Erro: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError", E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("O valor deve ser 1 ou abaixo", E_USER_WARNING);
 }
?>

A saída do código acima deve ser semelhante a isso:

Erro: [512] O valor deve ser 1 ou abaixo
O webmaster foi notificado

Os e-mails recebidos a partir do código acima são semelhantes a isso:

Erro: [512] O valor deve ser 1 ou abaixo

Este método não é adequado para todos os erros. Erros comuns devem ser registrados no servidor usando o sistema de registro padrão do PHP.